对于这样的一道题,转换成 int 再计算也是不太现实的,因为超过了2^31-1的数整形就放不下了,尽管用long long,当遇到成百上千位的数的时候也是无能为力的了,所以这道题需要模拟乘法计算的方法才能解决。
参考代码及注释:
class Solution { public: string multiply(string num1, string num2) { int end1=num1.size();//计算字符串长度 int end2=num2.size(); //由于两个数相乘的位数一定是这两个数自己的位数相加-1或者是这两个数位数相加的 //例如,23*356,23是两位数,356是三位数,两个相乘的结果肯定是4位数或者是5位数的 //所以需要创建一个和操作数位数相加一样大小的字符串对象。并将它初始化为0 string res(end1+end2,'0'); //由于乘法是num1的所有数和num2的所有数都要相乘一遍,所以可以用一个二层循环完成 int i=0; int j=0; for(i=end1-1;i>=0;i--) { for(j=end2-1;j>=0;j--) { //tmp代表的是num1对应的位置和num2对应的位置相乘的结果+上一次计算的进位 //(如果没有就+了0也不影响结果),注意需要先转换成整形才能进行乘法计算 int tmp = (res[i+j+1]-'0')+(num1[i]-'0')*(num2[j]-'0'); //由上面计算演示的图片知道相乘得到的结果的个位就是放在res[i+j+1]上, //注意需要先变回字符 res[i+j+1]=(tmp%10)+'0'; //相乘结果的十位需要放到res[i+j]上,但是这里的tmp/10只是进位,所以不能直接 //赋值给res[i+j],而是+=在res[i+j]上,需要和下一次相乘得到的结果相加以后才能 //才能赋值,注意这里是res[i+j]+=tmp/10,不用+'\0',因为res[i+j]本来就是'\0' //只需要直接加到res[i+j]上面就好了 res[i+j]+=tmp/10; } } //加完之后可能存在前导0,所以需要遍历找到第一个不为0的字符,返回从这个位置开始 //往后的字符串就是最终的结果 for(i=0;i<end1+end2;i++) { if(res[i]!='0') { return res.substr(i); } } //不排除相乘的结果是'0'哈 return "0"; } };