2018年台州学院集训队新人报到赛解题报告

关于进制转换的理解和实现-by BobHuang

J:进制转换II

int可以表达范围[-2^31 , 2^31 -1] 即 [-2147483648,2147483647]的数,给我一个数组和数我怎么在两者之间进行转换呢?我们需要做的就是获取某一位。比如TOJ1472,我们需要的就是逆置这个数,我们第一想法就是去获取这个每一位,因为这个数位较少,除法和取余就可以了,但是如果到TOJ2779就会发现这种方法实在太麻烦了,我们就可以想一下新奇的做法,那就是循环用数组去存储。

循环可以这样写

#include<stdio.h>

int s[105];

int main()

{

    int n;

    while(~scanf("%d",&n))

    {

        int l=0;

        while(n)

        {

            s[l++]=n%10;//将得到的这一位存储起来

            n/=10;//舍去这一位

        }

        for(int i=l-1;i>0;i--)printf("%d",s[i]);

        printf("%d\n",s[0]);//输出这个串并换行

    }

    return 0;

}

这样解决问题是不是简单多了,但是你会发现0并不能解决。可以用do while或者0特判去避免这个问题,因为0总是要输出的,事情证明,这个问题也往往会被忽略。

如果这个题目弱化了,就是这个位数只有30位了,也就是在我可以表示的范围内,那我就可以把上面的操作倒回来

#include <stdio.h>

char s[1005],t[255];

int main()

{

    scanf("%s",s);

    int sum=0,i;

    for(i=0;s[i];i++)sum=sum*2+s[i]-'0';

    printf("%X",sum);

    return 0;

}

这里printf里面提供了可以输出16进制的格式%X,就能让我把代码写的很简洁

这个题目的位数比较多,但是我可以四位一处理,但是可以前面四位是不足的,要进行补0操作,但是对字符串补0其实也是可以倒着做回去的,代码思路如下所示

#include <stdio.h>

#include <string.h>

char s[1005],t[255];

int main()

{

    int T;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%s",s);

        int l=strlen(s),tot=0,i;//tot是t有几位

        for(i=l-1;i>=0;i-=4)

        {

            int j=i,sum=0,tmp=1;

            while(j>=0&&j>i-4)sum=sum+(s[j]-'0')*tmp,tmp*=2,j--;//这个因为我是倒着处理的,所以就是把当前位乘上它的权就好,由于容易越界,所以还是倒着写了

            if(sum>9)t[tot++]=sum-10+'A';//大于9就是和'A'进行强制转换

            else t[tot++]=sum+'0';//小于就是9

        }

        for(i=tot-1;i>0;i--)printf("%c",t[i]);//倒置

        printf("%c\n",t[0]);

    }

    return 0;

}



为解题报告打分
暂时不评分

★★
★★★
★★★★
★★★★★
发表您的评论(若贴AC代码或发表禁止言论等违禁行为将被删除并扣除积分)

|返回 |   | 转到页头|
Copyright @ 2008-2024(浙ICP备2022001332号), TZOJ. All Rights Reserved.