题解 P1604 【B进制星球】

· · 题解

让刚学高精加的蒟蒻发一下题解吧。

相信很多跟我一样的蒟蒻在看到B<=36时都吓到了,之后这题就一直没敢做,直到最近学了高精加才做出来。于是决定写一篇题解来帮助像我一样的蒟蒻理解一下高精加。

我们常用的高精加是在十进制下进行的,主要思路是将读入的字符串逆序转化成数组,(注意,逆序很重要,否则你无法解决加法的进位问题,个位也难以对齐),之后按位加减,当出现进位情况时,我们把十位上的数取出,当做进位加入下一位中,原位只保留个位。

在本题中并不一定是10进制,但基本思路是一样的。

不同之处:

  1. 输入会出现大写字母,但我们可以将大写字母转换成十进制下的两位数,这并不影响计算,最后再转成字母就好了

    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;
}```