ZCMU-1411:喜闻乐见的a+b

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;
}

猜你喜欢

转载自blog.csdn.net/waterboy_cj/article/details/81148237
A+B