【综合运用】数制转换

咳咳,刚刚做了一道刷了快半年的题,,,,先给大家看看我的惨状:

是不是很有意思!

好了,到了分析环节了,为了省去大家不必要的时间(才不是怕丢脸呢<-_<-),我就直接从修改过几次的代码开始讲吧。

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值