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.
Analysis:
Straight forward idea. Just like the way we multiply numbers. Don't forget considering the carry and be careful. e.g.
123*456,
what we usually do is:
123
* 456
-----------
738
615
+492
-----------
56088
thus, 123*456 = 56088.
In the same way, the algorithm is:
A*B
(1)For each element B[i]
Compute tmp = B[i]*A
Add tmp to the previous result, note the start position. res = res"+"tmp
(2)Return result.
To be specific,
(1) char2int, int(char-'0');
(2) int2char, char(int+'0')
(3) Don't forget the carry in each add or multiply operation.
(4) Don't forget the carry after last operation. e.g. 82+33 = 115.
(5) Be careful with the string order and the number order.
Update (201309) Code:
class Solution { public: string mpl(string num, char n){ //compute num*n string res=""; int carry=0; if (n=='0'){return "0";} for (int i=num.size()-1;i>=0;i--){ int m=(num[i]-'0')*(n-'0')+carry; carry = m/10; m=m%10; res = char(m+'0')+res; } if (carry!=0){res = char(carry+'0')+res;} return res; } void add(string &res, string m,int idx){ if (res==""){ res = m;} else{ m = m+string(idx,'0'); // this is important (you can also change value i instead) int carry=0; int i=res.size()-1; int j=m.size()-1; while (i>=0){ int k =(res[i]-'0')+(m[j]-'0')+carry; carry=k/10; k=k%10; res[i]=char(k+'0'); i--; j--; } while (j>=0){ // deal with the rest of string if (carry>0){ int kk = (m[j]-'0')+carry; carry = kk/10; kk=kk%10; res= char(kk+'0')+res; }else{ res = m[j]+res; } j--; } if (carry>0){ // be careful with highest digit res = char(carry+'0')+res; } } } string multiply(string num1, string num2) { // Start typing your C/C++ solution below // DO NOT write int main() function if (num1.size()==0 || num2.size()==0){return "";} //handle negative case bool pos=true; if (num1[0]=='-'){num1=num1.substr(1);pos = !pos;} if (num2[0]=='-'){num2=num2.substr(1);pos = !pos;} //main part string res="0"; for (int i=num2.size()-1;i>=0;i--){ //for each element in num2 string m=mpl(num1,num2[i]); // num1 multiply by num2[i] if (m!="0"){ add(res,m,num2.size()-1-i); // add m to the result } } if (!pos){res="-"+res;} return res; } };
No comments:
Post a Comment