P1604 B进制星球

P1604 B进制星球

题目描述

话说有一天,小 Z 乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用 \(B\ (2 \le B \le 36)\) 进制计数。星球上的人们用美味的食物招待了小 Z,作为回报,小 Z 希望送一个能够完成 \(B\) 进制加法的计算器给他们。现在小 Z 希望你可以帮助他,编写实现 \(B\) 进制加法的程序。

输入格式

数据数据共三行。

第一行,一个十进制的整数,表示进制 \(B\)

第二行和第三行,每行一个 \(B\) 进制数正整数。数字的每一位属于 \(\{\tt 0,1,2,3,4,5,6,7,8,9,A,B\cdots\}\)

输出格式

一个 \(B\) 进制数,表示输入的两个数的和。

样例

输入

4
123
321

输出

1110

提示

数据范围及约定

\(n,m\) 分别表示两个 \(B\) 进制数字的长度。

对于全部数据,\(1\le n,m\le 2000\)


思路

根据题目,每个数字长度小于等于 \(2000\),超过正常的整型数据范围,容易得出:\(B\) 进制的加法计算类似高精度的方法,即竖式相加的过程。不一样的地方是:

  1. 输入的字符中可能含有字母“\(A,B, \cdots\)”,需要将其转换成数字。可以参考 \(\operatorname{ASCII}\) 表,字母“\(A\)”的 \(\operatorname{ASCII}\) 码为 \(65\),对应的数字是 \(10\),相差 \(55\)。因此输入的字符减去“\(55\)”得到的整数存入高精度加数数组中。
  2. 当进制大于 \(9\) 时,计算出来的数字超过 \(9\),需要使用“\(A,B,\cdots\)”表达,则输出的数字加上“\(55\)”得到的整数强制转换为字符类型输出即可。

代码一:数组方式

#include <bits/stdc++.h>

using namespace std;

char s1[2010], s2[2010];
int lena, lenb, lenc, a[2010], b[2010], c[2010], base;

int main()
{
	scanf("%d %s %s", &base, s1, s2);
	lena = strlen(s1);
	lenb = strlen(s2);
	for (int i = 0; i < lena; i ++ )
	{
		if (s1[i] >= 'A')
			a[lena - i] = s1[i] - 55;
		else
			a[lena - i] = s1[i] - '0';
	}
	for (int i = 0; i < lenb; i ++ )
	{
		if (s2[i] >= 'A')
			b[lenb - i] = s2[i] - 55;
		else
			b[lenb - i] = s2[i] - '0';
	}
	lenc = max(lena, lenb);
	for (int i = 1; i <= lenc; i ++ )
	{
		c[i] += a[i] + b[i];
		c[i + 1] = c[i] / base;
		c[i] = c[i] % base;
	}
	if (c[lenc + 1] > 0)
		lenc ++;
	for (int i = lenc; i >= 1; i -- )
	{
		if (c[i] < 10)
			printf("%d", c[i]);
		else
			printf("%c", char(c[i] + 55));
	}
	return 0;
}

代码二:结构体重载运算符

#include <bits/stdc++.h>

using namespace std;

int base, lenx, leny;
char x[20010], y[20010];

struct node
{
	int len, s[20010];
	node()
	{
		len = 0;
		memset(s, 0, sizeof(s));
	}
} a, b, c;

node operator + (const node &a, const node &b)
{
	node c;
	c.len = max(a.len, b.len);
	for (int i = 1; i <= c.len; i ++ )
	{
		c.s[i] += a.s[i] + b.s[i];
		c.s[i + 1] += c.s[i] / base;
		c.s[i] %= base;
	}
	if (c.s[c.len + 1])
		c.len ++;
	return c;
}

void print(node a)
{
	for (int i = a.len; i >= 1; i -- )
	{
		if (a.s[i] >= 10)
			printf("%c", char(a.s[i] + 55));
		else
			printf("%d", a.s[i]);
	}
}

int main()
{
	scanf("%d %s %s", &base, x + 1, y + 1);
	lenx = strlen(x + 1);
	leny = strlen(y + 1);
	a.len = lenx;
	for (int i = 1; i <= lenx; i ++ )
	{
		if (x[i] >= 'A')
			a.s[lenx - i + 1] = x[i] - 55;
		else
			a.s[lenx - i + 1] = x[i] - '0';
	}
	b.len = leny;
	for (int i = 1; i <= leny; i ++ )
	{
		if (y[i] >= 'A')
			b.s[leny - i + 1] = y[i] - 55;
		else
			b.s[leny - i + 1] = y[i] - '0';
	}
	c = a + b;
	print(c);
	return 0;
}
posted @ 2024-04-13 15:54  IronMan_PZX  阅读(139)  评论(0)    收藏  举报
Title