之前留了坑,关于超大字符串型整数乘除的问题 还是以加减一文中的a1和a2为例(假设π小数点后50位乘以105010^{50}1050的值为a1,e小数点后30位乘以103010^{30}1030的值为a2),计算a1xa2,以及a1/a2的值
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 }
运行结果:
853973422267356706546355086954449319694770135199398255015274067614534738795213520
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者