进制的转换

来自 TOJ-BobHuang
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
",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
",t[0]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Kingpenguin/p/9948656.html