1113 钱串子的加法
分数 20
全屏浏览题目
切换布局
作者 陈越
单位 浙江大学
人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。
输入格式:
输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。
所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
输入给出的两个整数都不超过 105 位。
输出格式:
在一行中输出两个整数的和。注意结果数字不得有前导零。
输入样例:
2g50ttaq 0st9hk381
输出样例:
11feik2ir
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
例子:(pat1113钱串子加法)所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
//给出两个不一样长度的数字计算时可以翻转以后再计算。
第一步先把对应数字的表示给对应出来
#include <bits/stdc++.h>
using namespace std;
map<char,int>mp;//把字符转换成数字
map<int,char>mp1;//把数字转化为字符
int main() {
for (int i=0;i<20;i++) {
mp[char(i+'a')]=i+10;//mp[a]=10
mp1[i+10]=char(i+'a');//mp1[10]=a
}
for (int i=0;i<10;i++) {
mp[char(i+'0')]=i;//mp[0]=0,这里[0]的0是字符0
mp1[i]=char(i+'0');//mp[0]='0'
}
for (char i='a';i<'t';i++) {
cout<<mp[i]<<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
string s1,s2;
map<char,int>mp;
map<int,char>mp1;
vector<int> vec;
int a;
int main() {
cin>>s1>>s2;
for (int i=0;i<20;i++) {
mp[char(i+'a')]=i+10;
mp1[i+10]=char(i+'a');
}
for (int i=0;i<10;i++) {
mp[char(i+'0')]=i;
mp1[i]=char(i+'0');
}
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
for (int i=0;i<=max(s1.size(),s2.size());i++) {
char c1=(i<s1.size())?s1[i]:'0';
char c2=(i<s2.size())?s2[i]:'0';
//123456 s1 size 6 123456
//123 s2 size 3 123000
vec.push_back((a+mp[c1]+mp[c2])%30); //取个位
a=(a+mp[c1]+mp[c2])/30;//a是进位
}
int i=vec.size()-1;
while(mp1[vec[i]]=='0'&&i>0) {//i>0,是因为如果这个数只有一个零不能删他需要有输出
vec.pop_back();//删掉多余的零
i=vec.size()-1;
}
for(;i>=0;i--) {//这里i在前面有定义int i=vec.size()-1;
cout<<mp1[vec[i]];
}
return 0;
}