1.字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
1.num1 和num2 的长度都小于 5100.
2.num1 和num2 都只包含数字 0-9.
3.num1 和num2 都不包含任何前导零。
4.你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
分析:
1.sum结果的位数为num1与num2最大位数多一
2.mod为记录每位相加之后的进位数
string addStrings(string num1, string num2) {
int size=max(num1.size(),num2.size())+1;
string sum(size,'0');
int i=num1.size()-1;
int j=num2.size()-1;
int m=size-1;
int mod=0;
while(i>=0||j>=0){
int a=i>=0?(num1[i--]-'0'):0;
int b=j>=0?(num2[j--]-'0'):0;
if(a+b+mod<=9){
sum[m--]=a+b+mod+'0';
mod=0;
}else{
sum[m--]=a+b+mod-10+'0';
mod=1;
}
}
if(mod)sum[m]='1';
else sum.erase(sum.begin());
return sum;
}
2.字符串相乘
给定两个以字符串表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积。
注意:
1.num1 和 num2 的长度均小于110。
2.num1 和 num2 均只包含数字 0-9。
3.num1 和 num2 均不以零开头。
4.你不能使用任何内置的大整数库或直接将输入转换为整数。
分析:
1.建立一个整型数组,记录每位相乘的结果(逆序)
2.num1的每位逐个乘以num2的每位在加上前一位的进位mod
string multiply(string num1, string num2) {
int m=num1.size();
int n=num2.size();
vector<int> nums(m+n,0);
for(int i=0;i<m;i++){
int mod=0;
for(int j=0;j<n;j++){
nums[i+j]+=(num1[m-i-1]-'0')*(num2[n-j-1]-'0')+mod;
mod=nums[i+j]/10;
nums[i+j]%=10;
}
if(mod)nums[i+n]+=mod;
}
//当一个数乘以0时等于0
while(nums.back()==0&&nums.size()>1)nums.pop_back();
int size=nums.size();
string result(size,'0');
for(int i=0;i<size;i++)result[size-i-1]=nums[i]+'0';
return result;
}