您的位置:首页 > 其它

天梯模拟赛 L1 - 03 宇宙无敌加法器 【模拟加法】

2018-03-26 19:33 92 查看
L1-3 宇宙无敌加法器(20 分)

地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。

在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201


题意如上.

思路: 其实写过高精度的人都会觉得很简单, 因为就是模拟个加法, 带进位嘛, 所以按照题意模拟就好了.

唯一的坑点就是它的输入自带前导零, 所以你需要在最后的答案去前导零, 但是又有可能结果就是0, 所以我们需要特判下这种情况即可.

AC Code

void solve()
{
string s, a, b;
cin >> s >> a >> b;
string ans = "";
int lena = sz(a), lenb = sz(b);
int k = max(lena, lenb);
int jin = 0; int i, j;
for (i = lena-1, j = lenb-1 ; i >= 0 && j >= 0 ; i --, j--) {
int tmp = (a[i]-'0') + (b[j]-'0') + jin;
int zz = (s[--k] - '0') == 0 ? 10 : (s[k]-'0');
int pp = tmp % zz;
ans.pb(pp+'0');
jin = tmp / zz;
}
if (lena > lenb) {
for (int t = i ; t >= 0 ; t --) {
int tmp = (a[t] -'0') + jin;
int zz = (s[--k] - '0') == 0 ? 10 : (s[k]-'0');
int pp = tmp % zz;
ans.pb(pp+'0');
jin = tmp / zz;
}
}
else {
for (int t = j ; t >= 0 ; t --) {
int tmp = (b[t]-'0') + jin;
int zz = (s[--k] - '0') == 0 ? 10 : (s[k]-'0');
int pp = tmp % zz;
ans.pb(pp+'0');
jin = tmp / zz;
}
}
if (jin) {
ans.pb(jin+'0');
}
reverse(ans.begin(), ans.end());
string res = "";
int flag = -1;
for (int i = 0 ; i < sz(ans) ; i ++) {
if (ans[i] != '0') {
res = ans.substr(i, sz(ans)-i);
flag = i;
break;
}
}
if (flag == -1) printf("0\n");
else cout << res << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: