题目背景
进制题目,而且还是个计算器~~
题目描述
话说有一天,小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进制数,表示输入的两个数的和。
输入输出样例
说明
进制计算器
看到这道题打算用map做,map 的优点是能将字符于整形数直接一一对应起来,这样就和十进制的高精度加法没什么区别了。
代码如下:
#include <bits/stdc++.h> using namespace std; int main() { map<char, int> a;//每一个字符所对应的的数值; for(int i=0; i<=9; i++) { a[i+'0']=i; } for(int i=10; i<=35; i++) { a[i-10+'A']=i; } /* 循环后的效果如下; a["0"]=0;a["1"]=1;a["2"]=2;a["3"]=3;a["4"]=4;a["5"]=5;a["6"]=6; a["7"]=7;a["8"]=8;a["9"]=9;a["A"]=10;a["B"]=11;a["C"]=12;a["D"]=13; a["E"]=14;a["F"]=15;a["G"]=16;a["H"]=17;a["I"]=18;a["J"]=19;a["K"]=20; a["L"]=21;a["M"]=22;a["N"]=23;a["O"]=24;a["P"]=25;a["Q"]=26;a["R"]=27;a["S"]=28; a["T"]=29;a["U"]=30;a["V"]=31;a["W"]=32;a["X"]=33;a["Y"]=34;a["Z"]=35; */ map<int, char> b;//每一个数值所对应的字符; for(int i=0; i<=9; i++) { b[i]=i+'0'; } for(int i=10; i<=35; i++) { b[i]=i-10+'A'; } /* 循环后的效果如下; b[0]="0";b[1]="1";b[2]="2";b[3]="3";b[4]="4";b[5]="5";b[6]="6"; b[7]="7";b[8]="8";b[9]="9";b[10]="A";b[12]="B";b[13]="C";b[13]="D"; b[14]="E";b[15]="F";b[16]="G";b[17]="H";b[18]="I";b[19]="J";b[20]="K"; b[21]="L";b[22]="M";b[23]="N";b[24]="O";b[25]="P";b[26]="Q";b[27]="R";b[28]="S"; b[29]="T";b[30]="U";b[31]="V";b[32]="W";b[33]="X";b[34]="Y";b[35]="Z"; */ int n; scanf("%d",&n); char p[2010],q[2010]; char pp[2010],qq[2010];//做加法处理的两个串(由输入的两个字符串倒叙而来); for(int i=0; i<2010; i++) //这里一定要都预处理为'0',(不是清空),后面的加法时就不用考虑最后一位的情况了。 { pp[i]='0'; qq[i]='0'; } scanf("%s%s",&p,&q); int p1=strlen(p); int q1=strlen(q); int k=0; for(int i=p1-1; i>=0; i--) { pp[k++]=p[i]; } k=0; for(int i=q1-1; i>=0; i--) { qq[k++]=q[i]; } for(int i=0; i<max(p1,q1); i++) //这里和十进制的高精度加法一样,先看和是否超了n进制,超了就进位 { if(a[pp[i]]+a[qq[i]]<n) { pp[i]=b[a[pp[i]]+a[qq[i]]]; } else { pp[i]=b[a[pp[i]]+a[qq[i]]-n]; pp[i+1]=b[a[pp[i+1]]+1]; } } if(pp[max(p1,q1)]!='0')//看最后一位是否进位了,这里p++,q++只是为了让输出位数加一; { p1++; q1++; } for(int i=max(p1,q1)-1; i>=0; i--) { printf("%c",pp[i]); } printf(" "); return 0; }