
人类习惯用 10 进制,可能因为大多数人类有 10 根手指头,可以用于计数。这个世界上有一种叫“钱串子”(学名“蚰蜒”)的生物,有 30 只细长的手/脚,在它们的世界里,数字应该是 30 进制的。本题就请你实现钱串子世界里的加法运算。
输入格式:
输入在一行中给出两个钱串子世界里的非负整数,其间以空格分隔。
所谓“钱串子世界里的整数”是一个 30 进制的数字,其数字 0 到 9 跟人类世界的整数一致,数字 10 到 29 用小写英文字母 a 到 t 顺次表示。
输入给出的两个整数都不超过 105 位。
输出格式:
在一行中输出两个整数的和。注意结果数字不得有前导零。
输入样例:
2g50ttaq 0st9hk381
输出样例:
11feik2ir
代码长度限制16 KB
时间限制400 ms
内存限制64 MB
一个小坑:
测试点三的用例
0 0
正确答案:
0
在去掉前导零的时候不要忽略有答案为0的情况
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void reverse(char a[])
{
int left = 0, right = strlen(a) - 1;
char ch;
while (left < right)
{
ch = a[left];
a[left++] = a[right];
a[right--] = ch;
}
}
int main()
{
char shuzi[30] = { '0','1','2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n','o','p','q','r','s','t' };
char a[100005], b[100005];
int a1[100005], b1[100005],c[100005];
char c1[100005];
scanf("%s %s", a, b);
int len1, len2,lenlong,lenshort;
len1 = strlen(a), len2 = strlen(b);
int i, j;
for (i = 0; i < len1; i++)
{
for (j = 0; j < 30; j++)
{
if (a[i] == shuzi[j])
{
a1[i] = j; break;
}
}
}
for (i = 0; i < len2; i++)
{
for (j = 0; j < 30; j++)
{
if (b[i] == shuzi[j])
{
b1[i] = j; break;
}
}
}
lenlong = len1 > len2 ? len1 : len2;
lenshort= len1 > len2 ? len2 : len1;
int x = 0;
for (i = lenlong - 1,j=lenshort-1; i >= 0; i--,j--)
{
if (len1 > len2)
{
if(j>=0)
c[x++] = a1[i] + b1[j];
else
c[x++]=a1[i];
}
else
if(j>=0)
c[x++] = b1[i] + a1[j];
else
c[x++]=b1[i];
}
int d = 0, d1;
for (i = 0; i < lenlong; i++)
{
d1 = (c[i] + d) / 30;
c[i] = (c[i] + d) % 30;
d = d1;
}
c[lenlong] = d;
for (i = 0; i <=lenlong; i++)
{
c1[i] = shuzi[c[i]];
}
for(i=lenlong;i>=0;i--)
{
if(c1[i]!='0')
{c1[i+1]='\0';break;}
}
if(i<0)
printf("0");
else
{
reverse(c1);
printf("%s\n", c1);
}
return 0;
}