练涛

格雷码是以n位的二进制来表示数。
与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同。
首尾两个数字也要求只有1位之差。

有很多算法来生成格雷码。以下是较常见的一种:
从编码全0开始生成。
当产生第奇数个数时,只把当前数字最末位改变(0变1,1变0)
当产生第偶数个数时,先找到最右边的一个1,把它左边的数字改变。
用这个规则产生的4位格雷码序列如下:

0000
0001
0011
0010
0110
0111
0101
0100
1100
1101
1111
1110
1010
1011
1001
1000
#include<stdio.h>
#include<string.h>
#include<math.h>
void change(char &ch) {
    if (ch == '0')
        ch = '1';
    else
        ch = '0';
}
int main() {
    int n;
    scanf("%d", &n);            //输入需要转换的数
    int size = log2(n) + 1;     //计算所需位数
    char *a = new char[size];
    a[size] = '\0';
    memset(a, '0', size);       //初始化数组
    for (int i = 0; i <= n; i++) {
        if (i % 2) 
            change(a[size - 1]);    //奇数改末尾
        else
            for (int j = size - 1; j > 0; j--) {    //偶数操作
                if (a[j] == '1') {
                    change(a[j - 1]);
                    break;
                }
            }
        printf("%s\n", a);          //此行可去除
    }
    printf("result = %s\n", a);
    return 0;
}

 

 

posted on 2018-11-04 17:38  氵丨  阅读(1432)  评论(0编辑  收藏  举报