前面提到过很多次大整数的问题,这个是真正的大整数。
我用了一个很蠢得方法,先写一个大整数和一个个位数相乘的方法,返回的结果是一个string,然后写一个string相加的方法,每次循环,用其中一个数的每一位去乘另一个数,然后加到结果上。。
多么愚蠢的思路,居然还一遍过了。。一个更好的方法是先用两个int数组把两个string存一下,每位占数组中的一个数,然后再用一个int数组保存结果,每次也是用一个数的每一位去乘另一个数,结果直接加入到结果数组的对应位置,不考虑进位,最后再统一的计算进位。这种思路非常简单,应当用我一半的代码就能写完,而且不容易出错。一般也不会溢出,因为每次乘得到的数最大是81,要相加超过INT_MAX,string得非常长才行。
下面贴我自己的代码,供大家耻笑:
void reverse(string &s){
int len = s.length();
for(int i=0;i<len/2;i++){
char t = s[i];
s[i] = s[len-i-1];
s[len-i-1] = t;
}
}
string stringPlus(string a, string b){
int len1 = a.length(), len2 = b.length();
string res(max(len1, len2)+1, '0');
int i = 0, j = 0, len = min(len1, len2), c=0;
while(i<len){
int t = (a[i]-'0') + (b[i]-'0') + c;
res[i] = t%10 + '0';
c = t/10;
i++;
}
while(i<len1){
if(c>0){
int t = (a[i]-'0') + c;
res[i] = t%10+'0';
c = t/10;
}else{
res[i] = a[i];
}
i++;
}
while(i<len2){
if(c>0){
int t = (b[i]-'0') + c;
res[i] = t%10+'0';
c = t/10;
}else{
res[i] = b[i];
}
i++;
}
return res;
}
string numPlus(string &a, int low, int bit){
int len = a.length();
string res(len+bit+1, '0');
int start = bit, i=0, c=0;
while(i<len){
int t = (a[i]-'0')*low + c;
res[start] = t%10+'0';
c = t/10;
i++;
start++;
}
if(c>0)
res[start] = c+'0';
return res;
}
class Solution {
public:
string multiply(string num1, string num2) {
if(num1 == "")
return num2;
if(num2 == "")
return num1;
string res = "0";
reverse(num1); reverse(num2);
for(int i=0;i<num2.length();i++){
res = stringPlus(res, numPlus(num1, num2[i]-'0', i));
}
int len = res.length();
while(len-1&&res[len-1] == '0')
len--;
string mres(len, '0');
for(int i=0;i<len;i++){
mres[i] = res[len-i-1];
}
return mres;
}
};