Gray Code是一个数列集合 , 每个数使用二进位来表示 , 假设使用n位元来表示每个数好了 , 任两个数之间只有一个位元值不同:
如三位数的格雷码:
000 001 011 010 110 111 101 100
解法
观察奇数项的变化时,我们发现无论它是第几个Gray Code,永远只改变最右边的位元,如果是1就改为0,如果是0就改为1。
观察偶数项的变化时,我们发现所改变的位元,是由右边算来第一个1的左边位元。
c代码
#include<stdio.h>
#include<stdlib.h>
#define N 20
void change(int &);
int main()
{
int bits;
printf("输入位元数:");
scanf_s("%d", &bits);
int num[N];
for (int i = 0; i < bits; i++)
{
num[i] = 0;
printf("%d", 0);
}
printf("\n");
bool flag = true;
while (1)
{
int i;
if (flag)
{
change(num[0]); //奇数项的变化永远只改变最右边的位元,如果
//是1就改为0,如果是0就改为1
}
else
{
//偶数项的变化时,所改变的位元,是由右边算来第一个1的左边位元
for (i = 0; i < bits&&num[i] == 0; i++);
if (i == bits-1)
break;
change(num[i + 1]);
}
for (int i = bits - 1; i >= 0; i--)
printf("%d", num[i]);
printf("\n");
flag = !flag;
}
system("pause");
return 0;
}
void change(int &x)
{
x=(x == 0 ? 1 : 0);
//return x
}