咳咳,刚刚做了一道刷了快半年的题,,,,先给大家看看我的惨状:
是不是很有意思!
好了,到了分析环节了,为了省去大家不必要的时间(才不是怕丢脸呢<-_<-),我就直接从修改过几次的代码开始讲吧。
1、
//1.13
//01:数制转换
#include<cstdio>
#include<cstring>
#include<cmath>
int a,b;//a,b储存进制
long long x;
char s[25],n[25];
void toY2()
{
for(int i=0;i<strlen(n);i++)
{
if(n[i]>b)
{
n[i+1]++;
n[i]-=b;
}
if(n[i]>10) n[i]+=17;
}
}
void toY()//此函数有误
{
int num=0;
while(x)
{
n[num]=x%10;
x/=10;
num++;
}
toY2();
for(int i=strlen(n)-1;i>=0;i++)
printf("%c",n[i]+'0');
}
//切换为十进制
void strlwr()
{
for(unsigned int i=0;i<strlen(s);i++)
if(s[i]>='A'&&s[i]<='Z') s[i]+=32;
}
void Xto10_2(int k,int i)
{
if(k) x+=(k+9)*int(pow(a,strlen(s)-i-1)+0.5);
else x+=(s[i]-'0')*int(pow(a,strlen(s)-i-1)+0.5);
}
void Xto10()
{
strlwr();
for(unsigned int i=0;i<strlen(s);i++)
switch(s[i])
{
case 'a':
Xto10_2(1,i);
break;
case 'b':
Xto10_2(2,i);
break;
case 'c':
Xto10_2(3,i);
break;
case 'd':
Xto10_2(4,i);
break;
case 'e':
Xto10_2(5,i);
break;
case 'f':
Xto10_2(15,i);
break;
default:
Xto10_2(0,i);
}
}
int main()
{
scanf("%d %s %d",&a,s,&b);
Xto10();
toY();
return 0;
}
好了,我们先看到这个吧:
for(int i=strlen(n)-1;i>=0;i++)
这里的i++让几个月钱前的我,改了好久(不堪回首啊),现在完全是一眼看出,接下来是这里:
case 'f':
Xto10_2(15,i);
光看这里到看不出什么,不过对比一下前面的,我就想起这是以前为了省代码,把9以上的字母减去9之后再进行运算。。。结果这里忘改了。
然后呢,就是在调试到
while(x)
{
n[num]=x%10;
x/=10;
num++;
}
的时候,发现n[num]好像不对,就改成了int。。。
然后把这些地方都改了上去,发现还是错的,于是又改成long long,加大数组,结果:
//1.13
//01:数制转换
#include<cstdio>
#include<cstring>
#include<cmath>
long long a,b,x,n[105];//a,b储存进制,x储存转化为十进制之后的数,n用来输出
char s[105];
void toY()
{
int num=0;
n[0]=x;
while(x)
{
n[num++]%=b;
n[num]+=x/=b;
if(n[num-1]>9) n[num-1]+=39;
}
if(n[0]>9) n[num]+=39;
for(int i=num-1;i>=0;i--)
printf("%c",n[i]+'0');
}
void strlwr()//小写->大写
{
for(int i=0;i<strlen(s);i++)
if(s[i]>='A'&&s[i]<='Z') s[i]+=32;
}
void Xto10_2(int k,int i)
{
if(k) x+=(k+9)*int(pow(a,strlen(s)-i-1)+0.5);
else x+=(s[i]-'0')*int(pow(a,strlen(s)-i-1)+0.5);
}
void Xto10()
{
strlwr();
for(int i=0;i<strlen(s);i++)
switch(s[i])
{
case 'a':
Xto10_2(1,i);
break;
case 'b':
Xto10_2(2,i);
break;
case 'c':
Xto10_2(3,i);
break;
case 'd':
Xto10_2(4,i);
break;
case 'e':
Xto10_2(5,i);
break;
case 'f':
Xto10_2(6,i);
break;
default:
Xto10_2(0,i);
}
}
int main()
{
scanf("%d %s %d",&a,s,&b);
Xto10();
toY();
return 0;
}
咳咳,然后一直卡着了,不断用网上的进制转换工具一直对比答案,但是调试很多次也不知道哪里错了。。。
偶然在某个地方(不是提问<-_<-)看见了里面有一个很坑的数据:
“0”
。。。。。。。
于是我试了试我自己的程序,发现的确掉坑了。。。。
特殊处理了0,交上去就过了。。。。。。
这是什么坑题啊!!!
下面是代码时间:
//1.13
//01:数制转换
#include<cstdio>
#include<cstring>
#include<cmath>
int a,b,x,n[35];//a,b储存进制,x储存转化为十进制之后的数,n用来输出
char s[35];
void toY()
{
int num=0;
n[0]=x;
while(x)
{
n[num++]%=b;
n[num]+=x/=b;
if(n[num-1]>9) n[num-1]+=7;
}
if(n[0]>9) n[num]+=7;
for(int i=num-1;i>=0;i--)
printf("%c",n[i]+'0');
printf("\n");
}
void strlwr()//小写->大写
{
for(int i=0;i<strlen(s);i++)
if(s[i]>='A'&&s[i]<='Z') s[i]+=32;
}
void Xto10_2(int k,int i)
{
if(k) x+=(k+9)*int(pow(a,strlen(s)-i-1)+0.5);
else x+=(s[i]-'0')*int(pow(a,strlen(s)-i-1)+0.5);
}
void Xto10()
{
strlwr();
for(int i=0;i<strlen(s);i++)
switch(s[i])
{
case 'a':
Xto10_2(1,i);
break;
case 'b':
Xto10_2(2,i);
break;
case 'c':
Xto10_2(3,i);
break;
case 'd':
Xto10_2(4,i);
break;
case 'e':
Xto10_2(5,i);
break;
case 'f':
Xto10_2(6,i);
break;
default:
Xto10_2(0,i);
}
}
int main()
{
scanf("%d %s %d",&a,s,&b);
if(strlen(s)==1&&s[0]=='0')
{printf("0\n");return 0;}
Xto10();
toY();
return 0;
}