题目:
样例:
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(){
char x[50];//30位数字,longlong最大是2^64,也才是18位,所以输入输出只能用字符串
while(scanf("%s",x)!=EOF){
//千万不要直接上手就用x-'0'来得到这个数字,字符串和字符没法相减
if(strcmp(x,"0")==0){
printf("0\n");
continue;
}
char c[100];
int n=0;
int len=strlen(x);
for(int i=0;i<len;){
int k=0;
for(int j=i;j<len;j++){
int t=(k*10+(x[j]-'0'))%2;
x[j]=(k*10+(x[j]-'0'))/2+'0';//注意x在这个过程中不断更新着
k=t;
}
c[n++]=k+'0';//注意这里k没在for循环里,k是每一轮结束保存一个
while(x[i]=='0'){
i++;
}
}
for(int i=n-1;i>=0;i--){
printf("%c",c[i]);
}
printf("\n");
}
return 0;
}
/*
详解:用211来举例
2%2=0;//没有余数传给下一位,被整除
2/2=1;
k=0;
1%2=1;//余数传给下一位
1/2=0;
k=1;
11%2=1;
11/2=5;
k=1; //剩余105 第一轮结束 将k保存到a
1%2=1;余数传给下一位
1/2=0;
k=1;
10%2=0;
10/2=5;
k=0;
5%2=1;
5/2=2;
k=1;//剩余052 第二轮结束 将k保存到b
5%2=1;//余数传给下一位
5/2=2;
k=1;
12%2=0;
12/2=6;
k=0;//剩余26 第三轮结束 将k保存到b
2%2=0;
2/2=1;
k=0;
6%2=0;
6/2=3;
k=0;//剩余13 第四轮结束 将k保存到b
1%2=1;//余数传给下一位
1/2=0;
k=1;
13%2=1;
13/2=6;
k=1;// 剩余06 第五轮结束 将k保存到b
6%2=0;
6/2=3;
k=0;//剩余3 第六轮结束 将k保存到b
3%2=1;
3/2=1;
k=1;//剩余1 第七轮结束 将k保存到b
1%2=1;
1/2=0;
k=1;//剩余0 第八轮结束 将k保存到b
b=11001011
反过来输出就是11010011;
*/