题解 P1604 【B进制星球】
斯德哥尔摩
2017-08-18 12:44:25
这题就是 高精 ,加上一个并不怎么难的 进制转换 ,
注意,进制转换数组 是 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;//收尾。。。
}
```