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;
}