人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。
输入格式:
输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。
所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
输入给出的两个整数都不超过 105 位。
输出格式:
在一行中输出两个整数的和。注意结果数字不得有前导零。
输入样例:
2g50ttaq 0st9hk381
输出样例:
11feik2ir
解题思路:
图片看着吓人,我就不复制了。30进制的加法,注意考虑全零的情况
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAXN 100001
#define MAX(a, b) a>b ? a : b
void reverse(char *str, int length) {
int left = 0;
int right = length - 1;
char temp;
while ( left < right ) {
temp = str[right];
str[right] = str[left];
str[left] = temp;
++left;
--right;
}
}
int main(int argc, const char *argv[]) {
char *begin = NULL, num1[MAXN] = {0,}, num2[MAXN] = {0,}, new[MAXN] = {0,};
int i, len1, len2, end;
if ( scanf("%s", num1)==EOF ) printf("error\n");
if ( scanf("%s", num2)==EOF ) printf("error\n");
reverse(num1, len1 = strlen(num1));
reverse(num2, len2 = strlen(num2));
end = MAX(len1, len2);
for ( i=0; i<end; ++i ) {
if ( num1[i] != 0 ) {
if ( isalpha(num1[i]) )
new[i] += num1[i] - 'a' + 10;
else
new[i] += num1[i] - '0';
}
if ( num2[i] != 0 ) {
if ( isalpha(num2[i]) )
new[i] += num2[i] - 'a' + 10;
else
new[i] += num2[i] - '0';
}
if ( new[i] >= 30 ) {
new[i] -= 30;
new[i+1] += 1;
}
if ( new[i] >= 0 && new[i] <= 9 )
new[i] += '0';
else
new[i] += 'a' - 10;
}
if ( new[i] != 0 ) {
new[i] += '0';
++end;
}
reverse(new, end);
for ( i=0; i<end; ++i ) {
if ( new[i] > '0' && new[i] <= '9' || isalpha(new[i]) ) {
begin = &new[i];
break;
}
}
printf("%s\n", begin ? begin : "0");
return 0;
}