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\) 进制的加法计算类似高精度的方法,即竖式相加的过程。不一样的地方是:
- 输入的字符中可能含有字母“\(A,B, \cdots\)”,需要将其转换成数字。可以参考 \(\operatorname{ASCII}\) 表,字母“\(A\)”的 \(\operatorname{ASCII}\) 码为 \(65\),对应的数字是 \(10\),相差 \(55\)。因此输入的字符减去“\(55\)”得到的整数存入高精度加数数组中。
- 当进制大于 \(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;
}
标签:node,进制,int,P1604,s1,len,55,星球
From: https://www.cnblogs.com/IronMan-PZX/p/18132984