(3.5C)大数十进制转化为二进制

题目:

 样例:

 代码:

#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;  
 
*/ 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值