任务一 进制转换

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时,循环:

  1. n=n*2;
  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;
}

运行结果