题目
思路
进制转换+字符串的处理,算是pat常考题型了,之前就考过很多道类似的。
本来用了字符串+进制转换函数。但代码太麻烦了,需要用指针作为返回值。
参考了柳神的思路,更简洁方便。
- 以0补齐两段字符串,使之长度相同。
补齐方法:新定义一个字符串长度为差额,值为0。 再令原字符串=新串+原串。
string ss1(s.length()-s1.length(),'0');
s1=ss1+s1; //s1在ss1右侧,这样新得到的s1左侧即补0
- 逆序遍历,
每位的答案就是: (s1[i] - ‘0’ + s2[i] - ‘0’ + carry) % mod + ‘0’
每位的进位就是:(s1[i] - ‘0’ + s2[i] - ‘0’ + carry) / mod
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string s; cin>>s;
string s1,s2; cin>>s1>>s2;
string ss1(s.length()-s1.length(),'0');
s1=ss1+s1; //s1在ss1右侧,这样新得到的s1左侧即补0
string ss2(s.length()-s2.length(),'0');
s2=ss2+s2;
int len=s.length();
int mod,carry=0; //储存进制,进位
string ans(len,'0'); //确定ans的长度与s一致
for(int i=len-1;i>=0;i--){
if(s[i]=='0') mod=10;
else mod=s[i]-'0';
ans[i]=((s1[i]-'0'+s2[i]-'0')+carry)%mod+'0';
carry= ((s1[i]-'0'+s2[i]-'0')+carry)/mod;
}
if(carry!=0) ans='1'+ans; //r若第一位还有进位,则在答案左侧加一位
int flag=0; //辅助排除前面多补的0
for(int i=0;i<ans.length();i++){
if(ans[i]!='0' || flag) {
flag=1;
cout<<ans[i];
}
}
if(!flag) cout<<'0';
return 0;
}