-
题目描述:
-
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
-
输入:
-
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
-
输出:
-
每行输出对应的二进制数。
-
样例输入:
-
0 1 3 8
-
样例输出:
-
0 1 11 1000
分析:大数的进制转换,模拟手工除法计算,取每次余数的逆序即为对应二进制数(转换方法参考https://jingyan.baidu.com/article/495ba84109665338b30ede98.html) -
注意输入为0的情况,以及当商变小之后,会有前置的0
-
思路参考了http://blog.youkuaiyun.com/lecholin/article/details/70768137
-
-
代码如下:
-
#include <stdio.h> #include <string.h> int main(int argc, char** argv) { char str[30]; int num[30]; int output[100]; while(scanf("%s",str)!=EOF) { int len =strlen(str); int j; for(j=0;j<len;j++) { num[j]=str[j]-'0'; } int cnt=0;//记录余数的个数 while(1) { int i=0; while(num[i]==0&&i<len) i++;//算到后面,商比较小,前面会有0,跳过这些0 if(i==len) break;//说明商已经为0了,跳出循环 int mod=0;//被除数 int left=0;//余数 //模拟手工除法 for(;i<len;i++) { mod=left*10+num[i];//上一位的余数乘10,加上本位的数,作为新的被除数 num[i]=mod/2;//求商在本位上的数 left=mod%2;//余数 } output[cnt++]=left;//本次计算余数存入输出数组 } if(cnt==0) printf("%d",0);//如果输入为0 else{ for(j=cnt-1;j>=0;j--) { printf("%d",output[j]);//倒序输出余数 } } printf("\n"); } return 0; }