Problem E: 喜闻乐见的a+b
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 365 Solved: 136
[Submit][Status][Web Board]
Description
喜闻乐见的a+b来了,当然二进制,八进制,十进制什么的估计你们也懒得写了,来个20进制的a+b
Input
给出多组a和b,每个数字一行
数字由0~9和小写字母a~j(10~19)
给出的长度不超过100
Output
每组数据输出a+b的和。
Sample Input
1234567890
abcdefghij
99999jjjjj
9999900001
Sample Output
bdfi02467j
iiiij00000
HINT
【解析】
对不起,我收回我昨天说的话。PS:我是个正常人。。。。这个java内置的大数运算,好像胜任不了。。。。。我还是用自己熟悉的C写稳一点。
#include <bits/stdc++.h>
using namespace std;
int numa[110], numb[110];
char tab[21] = "0123456789abcdefghij";//20进制对照表
void reserve(char a[], int l)//转换数字顺序
{
for (int i = 0, j = l - 1; i < l / 2; i++, j--)
swap(a[i], a[j]);
}
void chuli(char a[], int numa[], int l)//将字符串处理成数字存入int型数组
{
int i = 0;
while (i < l)
{
if (a[i] >= '0'&&a[i] <= '9')
numa[i] = a[i] - '0';
else if (a[i] >= 'a'&&a[i] <= 'j')
numa[i] = a[i] - 'a' + 10;
i++;
}
}
void f(int ans[],int k)//开始转化进制
{
for (int i = 0; i < k; i++)
{
if (ans[i] >= 20)
{
ans[i] %= 20;
ans[i + 1] += 1;
}
}
}
int main()
{
char a[110], b[110];
int ans[110];
while (~scanf("%s%s", a, b))
{
memset(ans, 0, sizeof(ans));
int la = strlen(a), lb = strlen(b), i = 0, j = 0, k = 0;
reserve(a, la); reserve(b, lb);
chuli(a, numa, la), chuli(b, numb, lb);
while (i < la&&j < lb)
{
ans[k++] = numa[i++] + numb[j++];
}
while (i < la)
ans[k++] = numa[i++];
while (j < lb)
ans[k++] = numb[j++];
f(ans, k);
int pos = k, q;
for (; pos > 0; pos--)//找输出的位置(非0),去除前导的0
if (ans[pos] != 0)break;
for (int q = pos; q >= 0; q--)//逆序输出
printf("%c", tab[ans[q]]);
puts("");
}
return 0;
}