题解 P1604 【B进制星球】
让刚学高精加的蒟蒻发一下题解吧。
相信很多跟我一样的蒟蒻在看到B<=36时都吓到了,之后这题就一直没敢做,直到最近学了高精加才做出来。于是决定写一篇题解来帮助像我一样的蒟蒻理解一下高精加。
我们常用的高精加是在十进制下进行的,主要思路是将读入的字符串逆序转化成数组,(注意,逆序很重要,否则你无法解决加法的进位问题,个位也难以对齐),之后按位加减,当出现进位情况时,我们把十位上的数取出,当做进位加入下一位中,原位只保留个位。
在本题中并不一定是10进制,但基本思路是一样的。
不同之处:
-
输入会出现大写字母,但我们可以将大写字母转换成十进制下的两位数,这并不影响计算,最后再转成字母就好了
2.计算时不是逢十进一而是逢B进一。
3.想找不同也找不到了
付丑陋的代码:
#include<iostream>
#include<cstring>
using namespace std;
int a[2010],b[2010],c[2018],i,y,x,l1,l2,z;
char n[2001],m[2001];
int main(){
cin>>z;
cin>>n; cin>>m;
l1=strlen(n); l2=strlen(m);
for (i=0; i<l1; i++)
if (z>10&&n[i]>='A') a[l1-i]=n[i]-'A'+10;//字符串逆序存储
else a[l1-i]=n[i]-'0';//遇到字母转换成数字
for (i=0; i<l2; i++)
if (z>10&&m[i]>='A') b[l2-i]=m[i]-'A'+10;//同上
else b[l2-i]=m[i]-'0';
while (x<=l1||x<=l2){//高精加
x++;//x是位数指针
c[x]=y+a[x]+b[x]; //y是进位
y=c[x]/z; c[x]%=z;//在z禁止下逢z进1
}
while (c[x]==0&&x>1) x--; //去除前导零
for (i=x; i>=1; i--){
if (c[i]<10) cout<<c[i];
else cout<<(char)(c[i]+'A'-10);//z>10是要输出大写字母,类型要转换成char,否则会输出ASCII码
}
return 0;
}```