P1604 B进制星球
//高精度B进制加法
//B属于二到36
//每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。
#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[10000],b[10000],c[10000],la,lb,lc;//申明全局变量是自动设置为全零
int B;
int main() {
cin >> B;
cin >> x >> y;
la = x.length();
lb = y.length();
for (int i = 0; i < la; i++)
{
//需要判断是数字则减去零的ASCII值是字母要减去A的ASCII值
//注意有一个很重要的问题:如果一个字符的ascii值是大写字母的ascii值那么他也一定大于数字字符的ascii值
//字符字母的ascii值是大于字符数字的ascii值的
if (x[i] >='A' && x[i] <= 'Z')
{
a[la - i] = x[i] - 'A' + 10;//B进制中十代表的是A
}
else
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
if (y[i] >= 'A' && y[i] <= 'Z')
{
b[lb - i] = y[i] - 'A' + 10;
}
else
b[lb - i] = y[i] - '0';
}
//B进制加法
//结果的最大长度?
//考虑最极端的二进制加法:1111+11111=101110即四位数加五位数最多就是六位数
lc = max(la, lb);
for (int i = 1; i <= lc; i++) {
c[i] += a[i] + b[i];
c[i + 1] += c[i] / B;//处理进位信息
c[i] = c[i] % B;//计算本位
}
//加法可能会导致位数增加由上面的二进制加法可知
if(c[lc+1]>0) lc++;
for (int i = lc; i >= 1; i--)
{
//别忘了输出也有问题如果输出的是一个大于十的数字
if(c[i]>=10)
{
printf("%c",c[i]+'A'-10);
}
else
{
printf("%c",c[i]+'0');
}
}
return 0;
}