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