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.
个人思路
这个题目是写一个不限定长度的乘法器,花了三个晚上才AC。
我的思路是1、将乘数中的每个数字依次读出,与被乘数的每一位相乘,使用base存放值,add存放进位值。将求得的结果用二元数组vector<vector<int>>保存。
2、将二元数组中的元素前后均对齐,无法对其的补0占位。例如,123*456我们得到 738 615 492。我们采用前后补0的方式得到 00738,06150,49200.
然后同样使用base和add两个变量将其求和。结果保存在数组中,最后讲数组转化成string形式。
注意:乘数中存在0时,要特殊考虑,因为返回结果只能为0,不能为0000。
这种方法时间开销比较大,坚持写完也是因为自己花了很多时间调试。
1 class Solution { 2 public: 3 string multiply(string num1, string num2) { 4 if(num1=="0"||num2=="0"){ 5 return "0"; 6 } 7 vector< vector<int> > result; 8 //string answer; 9 //向上进位的值 10 int add = 0; 11 //留在该位的值 12 int base; 13 //两数相乘的结果 14 long multi; 15 long sumsult = 0; 16 // num1 = num1.crbegin(); 17 // num2 = num2.crbegin(); 18 for(int j = num2.size()-1;j>=0;j--){ 19 vector<int> lineresult; 20 for(int i = num1.size()-1;i>=0;i--){ 21 multi = atoi((num1.substr(i,1)).c_str())*atoi((num2.substr(j,1)).c_str()); 22 base = (multi+add)%10; 23 lineresult.push_back(base); 24 add = (multi+add)/10; 25 } 26 if(add!=0){ 27 lineresult.push_back(add); 28 add = 0; 29 } 30 result.push_back(lineresult); 31 } 32 //将所有项的位数对其 33 int lineNum = result.size(); 34 for(int i = 0;i<lineNum;i++){ 35 for(int j = 0;j<i;j++){ 36 result[i].insert(result[i].begin(),0); 37 } 38 } 39 for(int i = 0;i<lineNum;i++){ 40 for(int k = (result[i]).size();k<(result[lineNum-1]).size();k++){ 41 result[i].push_back(0); 42 } 43 } 44 add = 0; 45 base = 0; 46 //i代表每一位数,j代表加数的个数 47 for(int i = 0;i<result[lineNum-1].size();i++){ 48 int addsult = add; 49 for(int j = 0;j<lineNum;j++){ 50 addsult +=result[j][i]; 51 } 52 base = addsult%10; 53 result[lineNum-1][i] = base; 54 add = addsult/10; 55 } 56 if(add!=0){ 57 result[lineNum-1].push_back(add); 58 add = 0; 59 } 60 61 string turn = ""; 62 for (int i = result[lineNum-1].size()-1; i >= 0; i--) { 63 turn += to_string(result[lineNum-1][i]); 64 } 65 66 return turn; 67 68 } 69 };
他山之石
这个题目是写一个不限定长度的乘法器,花了三个晚上才AC。