人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。
输入格式:
输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。
所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
输入给出的两个整数都不超过 10^5 位。
输出格式:
在一行中输出两个整数的和。注意结果数字不得有前导零。
输入样例:
2g50ttaq 0st9hk381
输出样例:
11feik2ir
分析:将两个钱串子货币分别存储在string类型的a和b中,最后的答案存储在ans中。使用num_a、num_b分别储存a、b某一位对应十进制下的数。now为相加过程中的和,jin表示当前的进位。index作为最后输出答案时的下标。首先让a和b数位相等,这里可以让a更短(或相等),如果a的长度大于b的长度,就交换他们。同时,在a前面补上他们长度相差数的’0’,让位数对齐,方便计算。string c(n,’0′)表示创建一个长度为c,全部是’0’字符的字符串c。从右向左让a、b中对应的每一位相加,注意每一次还要加上进位。我们需要先将字符转换成对应的十进制数,如果当前的字符在’1’到’9’之间,那么直接将当前字符减’0’就可以得到我们要的数字,否则,要将当前字符减去’a’再加上10。使用模运算(%30)得到当前位数上应该存什么数字now,使用除法运算(/30)可以得到我们的进位jin。再把now转换成三十进制的字符,保存在ans的对应位置。
结束遍历后,如果还有进位,则在ans的左边在加一个’1’。接下来去除前导0,使用while循环,找到第一个ans内的值不等于0的下标。可以让index的值小于ans的长度-1,可以保证如果全是0的数相加,至少会保留一个零。最后从index到最后就是我们的答案啦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> using namespace std; string a, b, ans; int num_a, num_b, now, jin, index; int main(){ cin >> a >> b; if(a.size() > b.size()) swap(a, b); string c(b.size() - a.size(), '0'); a = c + a; ans.resize(a.size()); for (int i = b.size() - 1; i >= 0; i--) { if (a[i] >= '0' && a[i] <= '9') num_a = a[i] - '0'; else num_a = a[i] - 'a' + 10; if (b[i] >= '0' && b[i] <= '9') num_b = b[i] - '0'; else num_b = b[i] - 'a' + 10; now = (num_a + num_b + jin) % 30; jin = (num_a + num_b + jin) / 30; if(now < 10) ans[i] = (char)(now + '0'); else ans[i] = (char)(now - 10 + 'a'); } if (jin) ans = "1" + ans; while(index < ans.size() - 1 && ans[index] == '0') ++index; while(index < ans.size()) cout << ans[index++]; return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼