题目描述
话说有一天,小Z乘坐宇宙飞船,飞到一个美丽的星球。因为历史的原因,科技在这个美丽的星球上并不很发达,星球上人们普遍采用B(2<=B<=36)进制计数。星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。
输入输出格式
输入格式:
共3行第1行:一个十进制的整数,表示进制B。第2-3行:每行一个B进制数正整数。数字的每一位属于{0,1,2,3,4,5,6,7,8,9,A,B……},每个数字长度<=2000位。
输出格式:
一个B进制数,表示输入的两个数的和。
输入输出样例
输入样例#1:
4
123
321输出样例#1:
1110
思路:高精度加法,与十进制不同的是,将进位改成n即可,此外注意>10时,A~Z的输入输出转换
源代码
#include<iostream>
#include<cstring>
using namespace std;
char str1[2000],str2[2000];
int a[2000],b[2000],c[2000];
int main()
{
int n;
int lena,lenb;
int i;
cin>>n;//读入进制
cin>>str1>>str2;
lena=strlen(str1);
lenb=strlen(str2);
for(i=0;i<lena;i++)
{
if(str1[i]>='A'&&str1[i]<='Z')//A~Z读入的转换
a[lena-i]=str1[i]-'A'+10;
else
a[lena-i]=str1[i]-'0';
}
while(a[lena]==0&&lena>1)//去掉前导0
lena--;
a[0]=lena;
for(i=0;i<lenb;i++)
{
if(str2[i]>='A'&&str2[i]<='Z')//A~Z读入的转换
b[lenb-i]=str2[i]-'A'+10;
else
b[lenb-i]=str2[i]-'0';
}
while(b[lenb]==0&&lenb>1)//去掉前导0
lenb--;
b[0]=lenb;
c[0]=a[0]>b[0]?a[0]:b[0];//确定数位
int x=0;
for(i=1;i<=c[0];i++)
{
c[i]=a[i]+b[i]+x;
x=c[i]/n;
c[i]%=n;
}
if(x!=0)
{
c[++c[0]]=x;
x=0;
}
for(i=c[0];i>=1;i--)
{
if(c[i]>=10)//>10时输出A~Z
cout<<(char)(c[i]+55);
else//输出数字
cout<<c[i];
}
cout<<endl;
return 0;
}