1 条题解

  • 0
    @ 2025-8-24 21:27:00

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Taduro
    失落映衬黑暗,火焰燃尽光明

    搬运于2025-08-24 21:26:59,当前版本为作者最后更新于2018-05-05 10:13:12,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

    相信很多跟我一样的蒟蒻在看到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;
    }```
    • 1

    信息

    ID
    597
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者