【高精度】Bバンドプラネット
トピックの背景
Aryのタイトルだけでなく、電卓~~
タイトル説明
ある日、小さなZの宇宙船は、美しい惑星に飛ぶという。歴史的な理由のために、技術は非常によく、この美しい惑星、B(2 <= B <= 36)バイナリカウンタの遊星普及上に現像されません。おいしい食べ物と地球上の人々が、見返りに、小さなZを務め、それらに2進加算器の計算を完了することができ、小さなZ Bを送りたいです。Zは今少しバイナリ加算器Bプログラムを達成するために用意し、あなたが彼を助けることができると思います。
入力形式
3行1行目:10進数16進数Bを示し 行2-3:各ラインの正の整数小数B。すべての数は、{0,1,2,3,4,5,6,7,8,9、A、B ......}、各桁の長さ<= 2000に属します。
出力フォーマット
進数のB、2つの入力の数を表します。
サンプル入力と出力
入力#1レプリケーション
。4
123
321
の出力は、#1コピー
1110
説明/プロンプト
進計算を
分析
また、この問題は非常に正確なタイトルです。
最初の読み出しデータ列(データ番号と文字があるため)で、その後(A、B [] [付き]ここで、)アレイに記憶された対応する数に変換
し、高い精度で行わ添加。
いくつかの点**注:**また、高精度の加算器を毎日ことに留意されたい
nができ、次に繰り越す最上位ビットの小数表現よりも大きい場合に1
最上位ビットが0である防ぐために、2を
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;
}