之前留了坑,关于超大字符串型整数乘除的问题
还是以加减一文中的a1和a2为例(假设π小数点后50位乘以10的50次方的值为a1,e小数点后30位乘以10的30次方的值为a2),计算a1xa2,以及a1/a2的值

  • 分析,两个数x,y相乘,即(y的个位乘以x) + (y的十位乘以x)乘以10 + … + (y的最高位乘以x)乘以最高位 之和~
  • 如以1035x287为例,即7x1035 + 8x1035x10 + 2x1035x100,即乘法分配律的变形,1035x(7+80+200)=1035x287

  • //两个数相乘,积的长度不会超过两个数长度之和,如9999x9999=99980001

  • 一个核心点,确定好结果多长有几个坑,想办法设计算法,往坑位写入正确的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

func main(){
str1 := "314159265358979323846264338327950288419716939937510"
str2 := "2718281828459045235360287471352"
rs := multiply(str1,str2)
fmt.Println(rs)
}


func multiply(str1, str2 string) string {
l1, l2 := len(str1), len(str2)
l := l1 + l2
num := make([]int, l)

for i := 0; i < l1; {

for j := 0; j < l2; {
num[l-i-j-1] += int(str1[l1-1-i]-'0') * int(str2[l2-1-j]-'0')
j = j + 1
}

i = i + 1
}
//上面这段循环是核心,下面和大数加减大致都一样了~


//从最右往左边,处理进位
for n := l; n > 1; {
temp := num[n-1]
num[n-1] = num[n-1] % 10 //如35/10,得5
num[n-2] += temp / 10 //如35/10,得3,将3加到上一位
n = n - 1
}

//汇总字符串结果
res := ""

for _, i := range num {
s := strconv.Itoa(i)
res += s
}

//去除开头可能存在的0
if len(res) > 1 {
res = strings.TrimLeft(res, "0")
}

return res
}

运行结果:

1
853973422267356706546355086954449319694770135199398255015274067614534738795213520

戳此查看更多有趣的入门算法问题