格雷码(c/python略)

来源:互联网 发布:日本清酒 知乎 编辑:程序博客网 时间:2024/06/06 20:16

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 20void 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}