题目:
给定两个以字符串形式表示的非负整数 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、乘数的每一位转换成int型,然后与被乘数相乘,取得中间结果temp[i]。 如“12” * “123”,则中间结果为 “36”、“230”、“1200”。(注意这里高位应该相应的增大多个十倍)
2、将1得到的每一个中间结果temp相加。
代码:
class Solution { public: string multiply(string num1, string num2) { if(num1[0]-'0'==0 || num2[0]=='0') return "0"; string ans=""; int k=0; int JW=0; //1、进位 vector<string> temp(120,""); //2、很有必要初始化,因为要从某一个字符串开始填充数字字符 for(int i=num1.size()-1; i>=0; i--) { JW=0; int kk=k; while(kk--) temp[i] += '0'; //3、乘数的高位乘被乘数时,中间结果应该是多个十倍,如:1*21, 计算1*1时的中间结果为1,而1*2时的中间结果为20 for(int j=num2.size()-1; j>=0; j--) { int u1 = num1[i]-'0'; int u2 = num2[j]-'0'; if((u1*u2+JW)/10 > 0) { temp[i] += ((u1*u2+JW)%10+'0'); //4、解释说明第2条,i初始不是0,一开始从第i个string开始填充 JW = (u1*u2 + JW)/10; } else { temp[i] += ((u1*u2 + JW)+'0'); JW = 0; } } if(JW) { temp[i] += JW+'0'; } k++; //5、对应解释第3条 } //以下是把中间结果相加 int y=0; int len = temp[0].size(); //6、注意这里最长的应该是第0个数组,因为上面的i是倒序的,即乘数的最高位和被乘数相乘后得到的字符串应该最长 JW = 0; for(int i=0; i<len; i++) { y=0; for(int j=0; j<num1.size(); j++) //7、这里j的上限应该是乘数的位数,因为有多少个乘数就有多少个中间结果 { if( i < temp[j].size()){ //8、一定要注意这里,i的循环上限是最长的string的大小,但不是每一个中间结果都那么长,所以不加判断就会导致y加上了空值,程序出错 y += temp[j][i]-'0'; } } if((y+JW)/10 > 0) { ans += (y+JW)%10+'0'; JW = (y+JW)/10; } else { ans += (y+JW)+'0'; JW = 0; } } if(JW) ans += JW+'0'; string res=""; for(int i=ans.size()-1; i>=0; --i) res += ans[i]; return res; } };