43.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. // length < 110, non-negative
  7. func multiply(num1 string, num2 string) string {
  8. if num1 == "0" || num2 == "0" {
  9. return "0"
  10. }
  11. if num1 == "1" {
  12. return num2
  13. } else if num2 == "1" {
  14. return num1
  15. }
  16. n1 := str2IntSlice(num1)
  17. n2 := str2IntSlice(num2)
  18. sum := []int{}
  19. if len(n1) < len(n2) {
  20. n1, n2 = n2, n1
  21. }
  22. for index, num := range n2 {
  23. product := intSliceMulInt(n1, num)
  24. zeros := make([]int, len(n2)-1-index)
  25. product = append(product, zeros...)
  26. sum = addIntSlice(sum, product)
  27. }
  28. return intSlice2Str(sum)
  29. }
  30. func str2IntSlice(str string) []int {
  31. res := []int{}
  32. for _, char := range str {
  33. res = append(res, int(char-'0'))
  34. }
  35. return res
  36. }
  37. func intSlice2Str(slice []int) string {
  38. str := []rune{}
  39. for _, i := range slice {
  40. str = append(str, rune(i+'0'))
  41. }
  42. return string(str)
  43. }
  44. func addIntSlice(slice1, slice2 []int) []int {
  45. if len(slice1) < len(slice2) {
  46. slice1, slice2 = slice2, slice1
  47. }
  48. if len(slice2) == 0 || (len(slice2) == 1 && slice2[0] == 0) {
  49. return slice1
  50. }
  51. res := make([]int, len(slice1)+1)
  52. carry := 0
  53. for offset := 0; offset < len(slice1); offset++ {
  54. var digit, digit1, digit2 int
  55. if offset < len(slice2) {
  56. digit1 = slice1[len(slice1)-1-offset]
  57. digit2 = slice2[len(slice2)-1-offset]
  58. } else if offset < len(slice1) {
  59. digit1 = slice1[len(slice1)-1-offset]
  60. digit2 = 0
  61. } else {
  62. digit1, digit2 = 0, 0
  63. }
  64. digit, carry = addByDigit(digit1, digit2, carry)
  65. res[len(res)-1-offset] = digit
  66. }
  67. if carry == 0 {
  68. return res[1:]
  69. }
  70. res[0] = carry
  71. return res
  72. }
  73. func intSliceMulInt(slice []int, num int) []int {
  74. if num == 0 || len(slice) == 0 || (len(slice) == 1 && slice[0] == 0) {
  75. return []int{0}
  76. }
  77. if num == 1 {
  78. return slice
  79. }
  80. res := make([]int, len(slice)+1)
  81. carry := 0
  82. for offset := 0; offset < len(slice); offset++ {
  83. digit := slice[len(slice)-1-offset]
  84. digit, carry = mulByDigit(digit, num, carry)
  85. res[len(res)-1-offset] = digit
  86. }
  87. if carry == 0 {
  88. return res[1:]
  89. }
  90. res[0] = carry
  91. return res
  92. }
  93. func mulByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
  94. digit = digit1*digit2 + lastCarry
  95. carry = digit / 10
  96. return digit % 10, carry
  97. }
  98. func addByDigit(digit1, digit2, lastCarry int) (digit, carry int) {
  99. digit = digit1 + digit2 + lastCarry
  100. carry = digit / 10
  101. return digit % 10, carry
  102. }
  103. func testMultiply(num1 string, num2 string) {
  104. n1, _ := strconv.Atoi(num1)
  105. n2, _ := strconv.Atoi(num2)
  106. fmt.Printf("%s * %s = %s | %d\n", num1, num2, multiply(num1, num2), n1*n2)
  107. slice := str2IntSlice("12347876")
  108. intSlice2Str(slice)
  109. }
  110. /* func main() {
  111. testMultiply("782", "3908982")
  112. } */