1.二进制转十进制
从键盘输入二进制串(可以带小数,也可以不带小数),编写程序将其转换成二进制并输出。
样例输入:100001.101
样例输出:33.625
解题思路:
(1) 十进制数左移一位,扩大10倍;右移一位,缩小10倍
假设一个十进制数为x,在这个十进制数的后面加一个数字y,则新的十进制
数的值为:10x+y
(2) 二进制数左移一位,扩大2倍;右移一位,缩小2倍
假设一个二进制数为a,对应的十进制是x,在这个二进制数的后面加一个数
字y(0或1),则新的二进制数对应的十进制为:2x+y
如果2进制以字符的形式输入(即:y是字符型‘1’或‘0’),则新的二进制
数对应的十进制为: x*2+y-‘0’;
(3) 从键盘每读入一位二进制字符(0或1),立即计算当前二进制字符串的值。
直到遇到换行符。
【实验代码】
#includeint main() {char ch; float sum=0,weight=1; while((ch=getchar())!='\n') {if(ch=='.') break; sum=sum*2+ch-'0'; } if(ch=='.') {while((ch=getchar())!='\n') {weight=weight/2; sum=sum+(ch-'0')*weight; } } printf("%f\n",sum); return 0; }
运行结果:
2.十进制整数转二进制
从键盘输入一个十进制整数,以二进制的形式输出二进制
样例输入:237
样例输出:11101101
提示:可用下列方法实现
(1)用逻辑与运算、逻辑左移判断某一位是否为1(不能使用数组、字符串函数)
(2)用数组实现
(3)用字符串函数实现
【方法一】
#includeint main(){int n,i; scanf("%d",&n); //前导0不输出(第一个1前面的0为前导0) int lead=0; //0:前导0 1:遇到一个1以后的0,不是前导0 for(i=0;i<32;i++){if((n&0x80000000)==0x80000000){printf("%d",1); lead=1; //以后出现的0,不是前导0 } else{if(lead==1) printf("%d",0); } n=n<<1; } return 0; }
【方法二】
#includeint main(){int a[32],i=0,n; scanf("%d",&n); while(n!=0){a[i++]=n%2; n=n/2; } //结果二进制数存放在数组a中,a[0]是最低位,...a[i-1]是最高位 for(i=i-1;i>=0;i--)//反向输出a[i] printf("%d",a[i]); return 0; }
运行结果
3.十进制纯小数转二进制
从键盘输入一个十进制的纯小数,以二进制形式输出。
样例输入:0.71875
样例输出:0.10111
说明:小数点后不超过10位
解题思路:
当十进制数n大于0时,循环:
- n=n*2;
- 如果n大于等于1,输出1,并将整数部分1减去
否则输出0
【实验代码】
#includeint main(){float n; scanf("%f",&n); printf("0."); while(n>0){n=n*2; if(n>=1){printf("1"); n=n-1; } else printf("0"); } return 0; }
运行结果
4.带小数的十进制转二进制
带小数的十进制转二进制
样例输入:327.671875
样例输出:10100 0111.101011
说明:小数点后不超过10位
先转换整数部分,再处理小数点,再转换小数部分
【实验代码】
#includeint main() { float n,f; int i,d; scanf("%f",&n); d=(int)n;//取整数部分 f=n-d; //取小数部分 //将整数部分转化为二进制 //前导0不输出(第一个1前面的0为前导0) int lead=0; //0:前导0 1:遇到一个1以后的0,不是前导0 for(i=0;i<32;i++){ // &的优先级低于== if((d&0x80000000)==0x80000000){ printf("1"); lead=1; //以后出现的0,不是前导0 } else { if(lead==1) printf("0"); } d=d<<1; } int count=0;//记小数点后面的位数 if(f>0){ //小数部分大于0 printf("."); while(f>0){ f=f*2; if(f>=1){ printf("1"); f=f-1; }else printf("0"); count++; if(count==10) break; } } return 0; }
运行结果
5.十六进制转二进制
十六进制转二进制
样例输入:16AC9
样例输出:1 0110 1010 1100 1001
【实验代码】
#include#include int main() { char a[200]="",ch; while((ch=getchar())!='\n') { switch(ch) { case '0': strcat(a,"0000");break; case '1': strcat(a,"0001");break; case '2': strcat(a,"0010");break; case '3': strcat(a,"0011");break; case '4': strcat(a,"0100");break; case '5': strcat(a,"0101");break; case '6': strcat(a,"0110");break; case '7': strcat(a,"0111");break; case '8': strcat(a,"1000");break; case '9': strcat(a,"1001");break; case 'A': strcat(a,"1010");break; case 'B': strcat(a,"1011");break; case 'C': strcat(a,"1100");break; case 'D': strcat(a,"1101");break; case 'E': strcat(a,"1110");break; case 'F': strcat(a,"1111");break; } } strcat(a,"\0");//加上字符串结束标志 char *p=a; while(*p=='0') //跳过前导0,p指向第一个1 p++; printf("%s\n",p); return 0; }
运行结果