题目:Given two numbers represented as strings, return multiplication of the numbers as a string.
思路:重新编写乘法、加法函数
尤其注意究竟是数字操作还是字符本身操作,在好几个地方被卡主,都是保存为string的时候没有能够保存正确。
本题的思路遵循常见乘法思路:超过一位的两数相乘,把位数小的作为乘数,按照位数小的数,按位相乘。
程序的一个技巧就是,每每计算一次,就使得zeros后面添加一个0,这样移到下一位的时候就不需要额外的乘以10,而且还是字符串的形式。
但是最重要的就是编写字符串相乘函数,字符串相加函数,主要考虑相乘相加进位因素。
代码:
class Solution { public: //https://leetcode.com/problems/multiply-strings/ string addBig(string num1,string num2){ int m=num1.size(),n=num2.size(); if(m<n){ swap(num1,num2); swap(m,n); } int flag=0,i=m-1,j=n-1; int a=0; while(i>=0){ if(i>=0){ a+=num1[i]-'0'+flag; } if(j>=0){ a+=num2[j--]-'0'; } flag=a/10; num1[i--]=(a)%10+'0';a=0; } if(flag>0){ num1.insert(num1.begin(),flag+'0'); } /* int a = 0, i=m-1, j=n-1; while (i >= 0) { int x = a; if (i >= 0) x += num1[i--] - '0'; if (j >= 0) x += num2[j--] - '0'; num1[i+1] = x % 10 + '0'; a = x / 10; } if (a > 0) num1.insert(num1.begin(), '1'); */ return num1; } string multiplySingleNumber(string num,char c){ string result; int flag=0; if(c=='0') { return "0"; } for(int i=num.length()-1;i>=0;i--){ int a=(num[i]-'0')*(c-'0')+flag; num[i]=(a)%10+'0'; flag=a/10; } if(flag>0){ num.insert(num.begin(),flag+'0'); } return num; } string multiply(string num1, string num2) { int m=num1.size(); int n=num2.size(); if(m<n){ swap(m,n); swap(num1,num2); } string result,zeros; result="0"; for(int i=n-1;i>=0;i--){ if(num2[i]!='0'){ string s=multiplySingleNumber(num1,num2[i]); s+=zeros; result=addBig(s,result); } zeros.append(1,'0'); } /*for(int i=n-1;i>=0;i--){ if(num2[i]!='0'){ zeros=multiplySingleNumber(num1,num2[i]); zeros.append(n-1-i,'0'); result=addBig(zeros,result); } }*/ while((int)result.size()>1&&result[0]=='0'){ result.erase(result.begin()); } return result; } };