题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
解析
例子 :123,设二进制数组为w[]
-
w[i++]:123//2=?..1
-
? 作为下一个的除数: 1//2=0…1(余1加10)
(10+2)//2=6…0(余0加0)
(0+3)//2=1…1(余1,此处的1就是上一条的1)
得到?为 ()61 -
将61填入重复上述过程
-
…
代码
#include <stdio.h>
#include <string.h>
char s[35];
char buf[205];//结果
int main(){
int num[35];
while(scanf("%s",s)!=EOF){
//按位保存
int len = strlen(s);
for(int i=0;i<len;i++){
num[i]=s[i]-'0';
}
int i=0;
int len_str = 0;
//一位一位处理
while(i<len){
int c=0;
//从末位判断是1还是0
buf[len_str++] = (num[len-1])%2+'0';
//更新num数组,存储每次的商,作为下一次的除数
for(int j=i;j<len;j++){
int temp=num[j];
num[j] = (num[j]+c)/2;
if(temp%2 == 1){
c = 10;
}else {
c=0;
}
if(num[i]==0)
i++;
}
}
for(int i=len_str-1;i>=0;i--){
printf("%c",buf[i]);
}
printf("\n");
}
return 0;
}