第27题
(格雷码, GrayCode )
格雷码是对十进制数的一种二进制编码。编码顺序与相应的十进制数的大小不一致。其特点是:对于
两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数之间也仅有一个
二进制位不同,以 4 位二进制数为例,编码如下:
如果把每个二进制的位看作一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。因此,
格雷码广泛用于信号处理、数 - 模转换等领域。
下面程序的任务是:由键盘输入二进制数的位数 n(n<16) ,再输入一个十进制数 m(0 ≤m<2n) ,然
后输出对应于 m 的格雷码(共 n 位,用数组 gr[] 存放)。
为了将程序补充完整,你必须认真分析上表的规律,特别是对格雷码固定的某一位,从哪个十进制数
起,由 0 变为 1,或由 1 变为 0。
#include<stdio.h>
int main()
{
int bound=1,m,n,i,j,b,p,gr[15];
printf("inputn,m\n");
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)bound= ①;
if(m<0||m>=bound)
{
printf("Dataerror!\n");
② ;
}
b=1;
for(i=1;i<=n;i++)
{
p=0;b=b*2;
for( ③;j<=m;j++)
if( ④ )
p=1-p;
gr[i]=p;
}
for(i=n; ⑤ )
printf("%1d",gr[i]);/* 在"%1d" 中出现的是数字 1,不是字母 l*/
printf("\n");
}