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.
此题可以用来求两个大数相乘。
思路:逐位相乘处理进位法。
假设两个字符串a和b以及保存结果的字符串c. 对每个i,j;将a[i]*b[j]的结果加上c[i+j+1]上,所以c[i+j+1]是所有i+j位的乘积的累加。得到每位的结果后,在进行进位处理。最后再去掉c前面的'0',得到的结果即为最终结果。
乘积是逐位相乘,也就是ai*bj,结果加入到积C的第i+j+1位,最后处理进位即可,例如:A =17 = 1*10 + 7 = (1,7)最后是十进制的幂表示法,幂次是从高位到低位,以下同。B=25 = 2*10 + 5 = (2, 5);C = A * B = ( 0,1 * 2, 1 * 5 + 2 * 7,7 * 5) = (0,2,19,35) = (0,2,22,5) = (0,4,2,5)=(4,2,5)。
class Solution { public: string multiply(string num1, string num2) { if(!num1.size() || !num2.size()) return NULL; int N1 = num1.size(), N2 = num2.size(); vector<int> ans(N1+N2,0); //逐位运算 for(int i=0; i<N1; i++){ for(int j=0; j<N2; j++){ ans[i+j+1] += (num1[i]-'0')*(num2[j]-'0'); } } // 处理进位 for(int i = ans.size()-1; i>=0; i--){ if(ans[i]>=10){ ans[i-1] += ans[i]/10; ans[i] %= 10; } } //去掉多余的0 int i =0 ; while(ans[i]==0 && i<ans.size()-1) i++; string s(ans.size()-i,'0'); for(int j=0;i<ans.size();i++,j++){ s[j]='0'+ans[i]; } return s; } };