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.
思路:两数字字符串相乘,则必会出现超出整型范围的情况,所以这题我们不能只是单单将这俩个字符串转化为数字直接相乘。
1)定义一个数字字符串与一个数字字符相乘的函数,mul(string s,char ch)
2)定义俩数字字符串相加的函数,add(string s1,string s2)
3)处理字符串num1与字符串num2中每一位数字相乘的结果用temp暂时保存,同时要考虑该位数字处在哪一位上,就在所得结果后加上对应的0.最后使用add函数将result和temp相加。
注意,最后有这样一些情况——num1="0"或者num2="0",或者所得结果左边会有大量的无效零出现,这就要做相应的处理了。
class Solution { public: string mul(string s,char ch) { string res=""; int carry=0; for(int i=s.size()-1;i>=0;i--) { int num=(ch-'0')*(s[i]-'0')+carry; int d=num%10; carry=num/10; char ch_i=d+'0'; res=ch_i+res; } if(carry!=0) { char car=carry+'0'; res=car+res; } return res; } string add(string s1,string s2) { string res=""; int carry=0; int len1=s1.size(),len2=s2.size(); int i,j; for(i=len1-1,j=len2-1;i>=0||j>=0;) { int num; if(j<0) { num=(s1[i]-'0')+carry; i--; } else if(i<0) { num=(s2[j]-'0')+carry; j--; } else { num=(s1[i]-'0')+(s2[j]-'0')+carry; i--; j--; } int d=num%10; carry=num/10; char ch_i=d+'0'; res=ch_i+res; } if(carry!=0) { char car=carry+'0'; res=car+res; } return res; } string multiply(string num1, string num2) { int len1=num1.size(),len2=num2.size(); string result=""; if(len1<=0) return num2; else if(len2<=0) return num1; for(int i=len2-1;i>=0;i--) { string temp=mul(num1,num2[i]); for(int j=0;j<len2-1-i;j++) temp+='0'; result=add(result,temp); } //处理result左边无效零的情况 int i=0; while(result[i]=='0') i++; if(i==result.size()) return "0"; string str=result.substr(i,result.size()-i); return str; } };
思路2:用数组来模拟竖式乘法,但是高位进位处理比较麻烦,具体看代码。
class Solution { public: string multiply(string num1, string num2) { reverse(num1.begin(),num1.end()); reverse(num2.begin(),num2.end()); int len1=num1.size(),len2=num2.size(); string s(len1+len2,'0'); for(int i=0;i<len1;i++) { int carry=0; for(int j=0;j<len2;j++) { int digit=s[i+j]-'0'; int num=(num1[i]-'0')*(num2[j]-'0'); int res=digit+num+carry; s[i+j]=(res%10)+'0'; carry=res/10; } int index=i+len2; while(carry!=0) { int digit=s[index]-'0'; int res=digit+carry; s[index]=(res%10)+'0'; carry=res/10; } } int i=s.size()-1; while(s[i]=='0'&&i>=0) i--; if(i<0) return "0"; string str=s.substr(0,i+1); reverse(str.begin(),str.end()); return str; } };