题解 P1604 【B进制星球】

斯德哥尔摩

2017-08-18 12:44:25

Solution

这题就是 高精 ,加上一个并不怎么难的 进制转换 , 注意,进制转换数组 是 36 个,0~9 和 A~Z 剩下的就是高精度加的事了。。 附代码(缩进不喜勿喷。。。): ```cpp #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #define MAXN 2010//稍微开大一点,防止溢出 using namespace std; const char s[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};//进制转换数组,无须解释了吧。。。 char num1[MAXN],num2[MAXN]; int n,l1,l2,a[MAXN],b[MAXN],c[MAXN]; int main(){ int l; scanf("%d%s%s",&n,num1,num2);// %s 是一个很好用的东东。。 l1=strlen(num1); l2=strlen(num2); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c));//全部清0 for(int i=1;i<=l1;i++){//字符转换成数字,每个数组元素存一到两位 if(num1[l1-i]>='0'&&num1[l1-i]<='9') a[i]=num1[l1-i]-'0';//分两种情况:数字 或 大写字母 else a[i]=num1[l1-i]-'A'+10; } for(int i=1;i<=l2;i++){ if(num2[l2-i]>='0'&&num2[l2-i]<='9') b[i]=num2[l2-i]-'0';//同上 else b[i]=num2[l2-i]-'A'+10; } l=max(l1,l2);//两大数之和的位数是两数中 最长位数 或 最长位数+1 for(int i=1;i<=l;i++){ c[i]+=a[i]+b[i]; if(c[i]>=n){//进位问题 c[i]%=n; c[i+1]++; } } if(c[l+1]!=0)l++;//开头多一位的解决 for(int i=l;i>=1;i--) printf("%c",s[c[i]]);//输出,直接用 %c 字符 return 0;//收尾。。。 } ```