Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
题意:计算字符串对应数字的乘积。参考JustDoIT的博客。
思路:先用一维向量存放计算的中间值,中间值存放对应位置乘积的和(暂不考虑进位的情况);然后针对进位的情况,进行计算;注意要跳过开始为0的情况(因为向量开始全部初始为0);然后将数字转化为字符串。以234*156为例:
1 class Solution { 2 public: 3 string multiply(string num1, string num2) 4 { 5 int len1=num1.size(); 6 int len2=num2.size(); 7 vector<int> midVal(len1+len2,0); 8 9 int k=len1+len2-2; 10 for(int i=0;i<len1;++i) 11 for(int j=0;j<len2;++j) 12 { 13 midVal[k-i-j]+=(num1[i]-'0')*(num2[j]-'0'); //从右向左 14 } 15 16 int carry=0; //进位 17 for(int i=0;i<len1+len2;++i) 18 { 19 midVal[i]+=carry; 20 carry=midVal[i]/10; 21 midVal[i]%=10; 22 } 23 24 int i=len1+len2-1; 25 while(midVal[i]==0) //去除向量中最开始的0 26 i--; 27 28 if(i<0) return "0"; //全部为0时 29 30 //将值变成字符串 31 string res; 32 for(;i>=0;--i) 33 res.push_back(midVal[i]+'0'); 34 35 return res; 36 37 } 38 };
另外更高效的计算大整数乘法一般有:(1)karatsuba算法,复杂度为3nlog3≈3n1.585,可以参考百度百科、乘法算法-Karatsuba算法。(2)基于FFT(快速傅里叶变换)的算法,复杂度为o(nlogn), 可以参考FFT, 卷积, 多项式乘法, 大整数乘法