格雷碼是以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;
}