2020年PAT乙级春考B-4钱串子的加法 知识点:字符串 20分

84 阅读1分钟

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;
}