Leecode 43. 字符串相乘

感谢 闫老师在B站分享的视频!!!

题目描述:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

题目分析:
高精度乘法,题目约束num1和num2的长度最长110位,int只有32位,所以不能转为int进行乘法。
考虑字符串乘法,乘法规则如下:
如果先不考虑进位,第一个数的第i位乘以第二个数的第j位,可以得到最后结果中的第i+j位数。
如45*23,45和23
从低位到高位,第一个数的第0位5乘以第二个数的第0位3得到15
依次我们得到 三个数从高到低分别是 8、12+10、15
接下来,从低位到高位处理进位,分别是15->5,进位1、12+10+1->3,进位2、8+2->0,进位1
得到四个数,从高到低分别是 1 0 3 5,按位加到一起就是1035,即最后答案

代码如下:

string multiply(string num1, string num2) {
vector<int> arr(num1.size()+num2.size());
for(int i=0;i<num1.size();i++)
for(int j=0;j<num2.size();j++)
{
arr[num1.size()-1-i+num2.size()-1-j]+=(num1[i]-'0')*(num2[j]-'0');
}
int count=0;
for(int i=0;i<arr.size();i++)
{
int t=(arr[i]+count)%10;
count=(arr[i]+count)/10;
arr[i]=t;
}
string res;
int k=arr.size()-1;
while(k>0&&arr[k]==0)
k--;
for(int i=k;i>=0;i--)
res+=to_string(arr[i]);
return res;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容