这篇文章将为大家详细讲解有关golang刷leetcode技巧之如何实现大数相乘,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解题思路:
1,两数相乘最大长度是两个数的长度相加
2,num1[i] 和 num2[j]相乘,结果只影响i+j 位和i+j+1位
r[i+j+1]+= (r[i+j]+n1[i]*n2[j])/10 r[i+j]= (r[i+j]+n1[i]*n2[j])%10
3,计算结果转string需要关注头部的0,如果全0,保留一个0
代码实现:
func multiply(num1 string, num2 string) string { n1:=str2int(num1) n2:=str2int(num2) if n1==nil || n2==nil{ return "" } r:=make([]int64,len(n1)+len(n2)) for i:=0;i<len(n1);i++{ for j:=0;j<len(n2);j++{ r[i+j+1]+= (r[i+j]+n1[i]*n2[j])/10 r[i+j]= (r[i+j]+n1[i]*n2[j])%10 } } var s string j:=len(r)-1 for j>0 && r[j]==0{ j-- } for i:=0;i<=j;i++{ s=fmt.Sprintf("%d",r[i])+s } return s}func str2int(num string )[]int64{ if len(num)==0{ return nil } var r []int64 for i:=0;i<len(num);i++{ v,err:=strconv.ParseInt(string([]byte{num[i]}),10,10) if err!=nil{ return nil } r=append([]int64{v},r...) } return r}
关于“golang刷leetcode技巧之如何实现大数相乘”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/u/4586289/blog/4404145