1113 钱串子的加法 – PAT乙级真题

人类习惯用 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到最后就是我们的答案啦。

❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼

❤ 点击这里 -> 订阅《从放弃C语言到使用C++刷算法的简明教程》by 柳婼

❤ 点击这里 -> 订阅PAT甲级乙级、蓝桥杯、GPLT天梯赛、LeetCode题解离线版