1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者