【高精度】B进制星球
题目背景
进制题目,而且还是个计算器~~
题目描述
话说有一天,小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
说明/提示
进制计算器
分析
这题也是高精度题。
首先用string读入数据,(因为数据里有数字和字母),然后转换成对应数字 存放在数组里(这里用a【】,b【】)
然后做高精度加法。
**几个注意点:**这也是高精度加法的日常注意
1 如果最高位大于n进制,表示可以向前再进位
2 以防 最高位是 0的情况
3 输出,注意是从后往前,然后大于10还要转换成对应字母
具体看代码。。。。。。
代码
#include<iostream>
using namespace std;
const int maxn = 20000;
int n;
string x,y;
int a[maxn],b[maxn],c[maxn];
int main(){
cin>>n;
cin>>x>>y;
//读数据,存放
int lena = x.size();
int lenb = y.size();
for(int i=0;i<lena;i++){
if(x[i] >='0' &&x[i] <='9') a[lena -i] = x[i] -'0';
else if(x[i] >='A' && n>=10) a[lena-i] = x[i] -'A'+10;
}
for(int i=0;i<lenb;i++){
if(y[i] >='0' &&y[i] <='9') b[lenb -i] = y[i] -'0';
else if(y[i] >='A' && n>=10) b[lenb-i] = y[i] -'A'+10;
}
//ps:下面换成这样写也可以
//int lenc=0;
// int cf=0;
// while(lenc <=lena || lenc <=lenb){
// lenc++;
// c[lenc] = a[lenc] +b[lenc]+cf;
// cf =c[lenc]/n;
// c[lenc] %= n;
// }
// while(c[lenc]==0 && lenc >1){
// lenc--;
// }
// for(int i=lenc;i>=1;i--){
// if(c[i]>=10){
// cout<<(char)(c[i] +'A' -10);
// }else{
// cout<<c[i];
// }
// }
//取最长长度,做高精加法
int maxlen = max(lena,lenb);
for(int i=1;i<=maxlen;i++){
c[i] += a[i] + b[i];
c[i+1] = c[i]/n;
c[i] %= n;
}
maxlen++;
//如果最高位大于n进制,表示可以向前再进位
while(c[maxlen] >=n){
c[maxlen+1] = c[maxlen]/n;
c[maxlen] %= n;
maxlen++;
}
//以防 最高位是 0的情况
while(c[maxlen]==0 && maxlen >1){
maxlen--;
}
//输出,注意是从后往前,然后大于10还要转换成对应字母
for(int i=maxlen;i>=1;i--){
if(c[i]>=10){
cout<<(char)(c[i] +'A' -10);
}else{
cout<<c[i];
}
}
return 0;
}