前面提到过很多次大整数的问题,这个是真正的大整数。
我用了一个很蠢得方法,先写一个大整数和一个个位数相乘的方法,返回的结果是一个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; } };
leetcode第一刷_Multiply Strings
时间: 2024-11-06 12:22:18