1111~1115
1113 很难,看了题解
人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。
输入格式:
输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。
所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
输入给出的两个整数都不超过 105 位。
输出格式:
在一行中输出两个整数的和。注意结果数字不得有前导零。
输入样例:
2g50ttaq 0st9hk381
输出样例:
11feik2ir
思想:
1、统一字符串长度,把较短串用前导0填充。这里可以把处理短串固定位A串,用swap(a,b)交换两个字符串
2、把当前位转换成十进制进行计算,再把结果转换为十进制。用cur记录当前位,join记录进位
3、不要忘记处理最高位进位位
4、去除结果的前导0,输出结果字符串
代码:
//
// main.cpp
// PAT_1113_钱串子的加法
//
// Created by 徐精泽 on 2024/3/2.
//#include <iostream>
using namespace std;int main() {//转换成十进制运算,再转回30进制string A,B;cin>>A>>B;if(A.size()>B.size()) //保证A为短串swap(A,B); //交换两个字符串for(int i=0;i<B.size()-A.size();i++){ //用前导0填充短串A='0'+A;}string ans; //定义结果串ans.resize(A.size()); //resize()改变结果串的大小用null填充int join=0;for(int i=(int)A.size()-1;i>=0;i--){int a,b;if('0'<=A[i]&&A[i]<='9')a = A[i]-'0';else{a = 10+A[i]-'a';}if('0'<=B[i]&&B[i]<='9')b = B[i]-'0';else{b = 10+B[i]-'a';}int sum = a+b+join; //十进制计算和int cur = sum%30; //模30得当前位join = sum/30; //得到进位位if(cur>=0&&cur<=9)ans[i]='0'+cur;elseans[i]='a'+cur-10;}if(join>0) ans='1'+ans; //别忘记处理最高位进位//处理结果前导0int index=0;while(index<ans.size()-1&&ans[index]=='0')index++;//输出for(int i=index;i<ans.size();i++)cout<<ans[i];//如果结果为0,即0+0=0 ,测试点3cout<<endl;return 0;
}