1113 钱串子的加法 - PAT (Basic Level) Practice (中文) (pintia.cn)
解析:1113 钱串子的加法 – PAT乙级真题 – 柳婼 の blog (liuchuo.net)
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2,ans; cin >> s1 >> s2;
//补0,方便对齐计算
if (s1.size() > s2.size())swap(s1,s2);
while (s1.size() < s2.size())s1 = '0' + s1;
ans.resize(s1.size()); //ans必须开辟空间,否则通过不了
int num_s1 = 0, num_s2 = 0, jin = 0, sum = 0;
//从右向左进行相加,方便计算进位
for (int i = s2.size() - 1; i >= 0; i--)
{
if (isalpha(s1[i]))
{
num_s1 = s1[i] - 'a' + 10;
}
else num_s1 = s1[i] - '0';
if (isalpha(s2[i]))
{
num_s2 = s2[i] - 'a' + 10;
}
else num_s2 = s2[i] - '0';
//开始相加 按照30进制
sum = (num_s1 + num_s2 + jin) % 30;
jin= (num_s1 + num_s2 + jin)/ 30;
//判断一下相加完之后的每一位,如果小于10就用数字存储,否则就转化为字母存储
if (sum < 10)ans[i] = (char)(sum + '0');
else ans[i] = (char)(sum - 10 + 'a');
}
//进位
int idx = 0; //idx是从0开始,所以等会是正着输出
if (jin)ans = "1" + ans;
//cout << ans<<endl;
//去除前导0 这里让idx<size-1就是为了保留尾部的0,只去掉前导0
while (idx < ans.size() - 1 && ans[idx] == '0')++idx;
//输出
while (idx < ans.size())cout << ans[idx++];
return 0;
}