1074 宇宙无敌加法器 (20 分)
简单来说,就是把两个相加数逆转,补0成相同长度,模仿手动加法从s[0]开始加,s[i]进制并注意进位值,并将结果逆转回去,从结果的个数按10进制权值相加输出防止输出结果高位的0
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int main() {
string s,s1,s2;
vector<int>res;
cin>>s>>s1>>s2;
int maxlen=s1.length(),carry=0,sum=0; //maxlen为相加数的最长长度,carry进位值
reverse(s.begin(),s.end()); //逆转字符串,相当于个位对齐
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
if(s1.length()>s2.length()){ //s1比s2长,s2尾端补0,相当于高位补0
s2.append(s1.length()-s2.length(),'0');
}
if(s2.length()>s1.length()){
s1.append(s2.length()-s1.length(),'0');
maxlen=s2.length();
}
for(int i=0;i<maxlen;i++){ //相加数逐个相加,模仿手动加法
res.push_back(s1[i]-'0'+s2[i]-'0'+carry);
if(s[i]=='0'){ //s[i]为0表示10
carry=res[i]/10;
res[i]=res[i]%10;}
else {
carry=res[i]/(s[i]-'0'); //进位数为相加值除以n进制
res[i]=res[i]%(s[i]-'0'); //该位结果为相加值除以n进制的余数
}
}
if(carry!=0)res.push_back(carry); //最高位有进位,结果加一位
reverse(res.begin(),res.end());
for(int i=0;i<res.size();i++){ //从尾到头输出
sum+=res[i]*pow(10,i);
}
cout<<sum;
system("pause");
return 0;
}