add.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func add(a, b string) string {
  7. // 反转字符串,方便从低位到高位计算
  8. a = reverse(a)
  9. b = reverse(b)
  10. // 把字符串转换为数组,方便运算
  11. aArr := strings.Split(a, "")
  12. bArr := strings.Split(b, "")
  13. // 判断谁的长度更长,确定循环次数
  14. n := len(aArr)
  15. if m := len(bArr); m > n {
  16. n = m
  17. }
  18. // 初始化结果字符数组,用于存储计算结果
  19. res := make([]string, n)
  20. // 进位标志
  21. carry := 0
  22. // 从低位到高位进行计算
  23. for i := 0; i < n; i++ {
  24. x := 0
  25. if i < len(aArr) {
  26. x = int(a[i] - '0')
  27. }
  28. y := 0
  29. if i < len(bArr) {
  30. y = int(b[i] - '0')
  31. }
  32. sum := x + y + carry
  33. res[i] = string(sum%10 + '0')
  34. carry = sum / 10
  35. }
  36. // 如果最高位有进位,则把进位加入结果字符数组的最前面
  37. if carry > 0 {
  38. res = append([]string{string(carry + '0')}, res...)
  39. }
  40. // 反转字符数组,得到最终结果
  41. return reverse(strings.Join(res, ""))
  42. }
  43. // 字符串反转函数
  44. func reverse(s string) string {
  45. runes := []rune(s)
  46. for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
  47. runes[i], runes[j] = runes[j], runes[i]
  48. }
  49. return string(runes)
  50. }
  51. func main() {
  52. fmt.Println(add("12345678901234567890", "98765432109876543210"))
  53. }