本题源自LeetCode
----------------------------------------
思路 :
用一个字符串存结果长度为字符串1加上字符串2 的和,
1 双重循环,将俩个字符串从尾到头遍历,将字符串1 的每一位相乘字符串2 的每一位赋值给结果字符串。
2 是否有进位,
3 最后截取结果字符串第一位不是0的的非零子串
代码1:
string multiply(string num1, string num2) {
int len1=num1.length();
int len2=num2.length();
string result(len1+len2,'0');
int carry=0;
for(int i=len1-1;i>=0;i--){
int a=num1[i]-'0';
for(int j=len2-1;j>=0;j--){
int b=num2[j]-'0';
int c=result[i+j+1]-'0';
int num=a*b+c+carry; //低位相乘+进位+原值
result[i+j+1]=num%10+'0';
carry=num/10; //求进位
}
if(carry){
result[i]=carry+'0';
carry=0;
}
}
int i=0;
while(i<result.length()&&result[i]=='0')
i++;
return i==result.length()?"0":result.substr(i);
}
代码2:
string multiply(string num1, string num2) {
int len1=num1.length();
int len2=num2.length();
vector<int> tmp(len1+len2,0);
string res(len1+len2,'0');
for(int i=len1-1;i>=0;i--)
{
for(int j=len2-1;j>=0;j--)
tmp[i+j+1]+=(num1[i]-'0')*(num2[j]-'0'); //从tmp第一位开始
}
int carry=0; //进位
for(int i=len1+len2-1;i>0;i--) //从个位开始
{
tmp[i]+=carry;
carry=tmp[i]/10;
tmp[i]=tmp[i]%10;
res[i]=tmp[i]+'0';
}
if(carry){
res[0]=carry+'0'; //第0位没用。判断最高位是否有进位
carry=0;
}
int i=0;
while(res[i]=='0'&&i<res.length())
i++;
return i==res.size()?"0":res.substr(i);
}
大数加法
string add(string num1,string num2)
{
int len1=num1.size();
int len2=num2.szie();
int maxLen=max(len1,len2);
vector<int> tmp(maxLen+1,0);
string res(maxLen+1,'0');
int carry=0;
int i=len1-1;
int j=len2-1;
int k=maxLen;
while(i>=0&&j>=0)
{
int cur=(num1[i]-'0'+num2[j]-'0')+carry;
tmp[k--]=cur%10;
carry=cur/10;
}
while(i>=0)
{
int cur=(num1[i]-'0')+carry;
tmp[k--]=cur%10;
carry=cur/10;
}
while(j>=0)
{
int cur=(num2[j]-'0')+carry;
tmp[k--]=cur%10;
carry=cur/10;
}
for(int i=0;i<maxLen+1;i--)
{
res[i]=tmp[i]+'0';
}
int t=0;
while(t<res.size()&&res[t]=='0')
t++;
return t==res.size()?"0":res.substr(t);
}