今天写了B进制星球,在两次10分之后AC了,不容易啊~~~
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a1[2100],c1[2100];
int a[2100],c[2100],w[2100];
int main()
{
int b,la,lc,j,x;
scanf("%d",&b);
cin>>a1;
cin>>c1;
la=strlen(a1); lc=strlen(c1);
for(int i=0;i<la;i++)
if(b>10&&a1[i]>='A')
a[la-i]=a1[i]-'A'+10;
else a[la-i]=a1[i]-'0';
for(int i=0;i<lc;i++)
if(b>10&&c1[i]>='A')
c[lc-i]=c1[i]-'A'+10;
else c[lc-i]=c1[i]-'0';
x=0;j=0;
while(x<=lc||x<=la){
x++;
w[x]=a[x]+c[x]+j;
j=w[x]/b; w[x]=w[x]%b;
}
while (w[x]==0&&x>1) x--;
for(int i=x;i>=1;i--){
if(w[i]<10) cout<<w[i];
else cout<<(char)(w[i]+'A'-10);}
return 0;
}
//if(x==2&&w[x]==0)
//cout<<0;
//else{
//while(w[x]==0)
//x--;
//自己的想法
//for(int i=0;i<lc;i++)
//if(b>10&&c1[i]>='A')
//c[la-i]=c1[i]-'A'+10;
//else c[la-i]=c1[i]-'0';
先解释一下吼
第一次是因为忘记了第二个加数的输出,去前导零也有问题
第二次修复了一些问题,学习了题解中区前导零的方法,进位照常
以后可以多打空格,好检查,但要保证代码简洁
题解代码
#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;}