P1604 B进制星球

P1604 B进制星球

题目描述

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

输入格式

数据数据共三行。

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

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

输出格式

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

样例

输入

4
123
321

输出

1110

提示

数据范围及约定

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

对于全部数据,1n,m2000


思路

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

  1. 输入的字符中可能含有字母“A,B,”,需要将其转换成数字。可以参考 ASCII 表,字母“A”的 ASCII 码为 65,对应的数字是 10,相差 55。因此输入的字符减去“55”得到的整数存入高精度加数数组中。
  2. 当进制大于 9 时,计算出来的数字超过 9,需要使用“A,B,”表达,则输出的数字加上“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 @   IronMan_PZX  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
Title
点击右上角即可分享
微信分享提示