标签:格雷码简介与生成
Gray Code简介及生成
在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
根据格雷码的特性,其每一位的编码都能由前一位编码得到,方法是做镜面对称,然后在最左侧上半部分补0,下半部分补1,可以通过数组简单模拟得到,缺点是数字大的时候就存不下来了
#include <cstdio> #include <cstring> #define num 20 bool g[1 << num][num]; int main() { g[0][0] = 0; g[1][0] = 1; for(int i = 1; i < num; i++) { int k = 0; while(k < i) { for(int j1 = 0; j1 < (1 << i); j1++) { int j2 = (1 << (i + 1)) - 1 - j1; g[j2][k] = g[j1][k]; } k++; } for(int j1 = 0; j1 < (1 << i); j1++) { int j2 = (1 << (i + 1)) - 1 - j1; g[j1][k] = 0; g[j2][k] = 1; } k++; } int n; while(true) { printf("Please input\nn = "); scanf("%d", &n); if(n == 0) break; printf("\nShow %d Gray Code :\n", n); for(int i = 0; i < (1 << n); i++) { for(int j = n - 1; j >= 0; j--) printf("%d ", g[i][j]); printf("\n"); } printf("\n"); } }
老师出的题是输出无穷大位数的格雷码,显然不能使用任何数据结构,我们再回到格雷码,观察其规律可以发现对于同一位数的第奇数组和偶数组序列,奇数组是都是先0后1,偶数组都是先1后0,通过这个规律和格雷码本身的性质我们可以直接计算出格雷码
#include <cstdio> #define judge (i % (1 << j)) < ((1 << j) >> 1) int main() { int bit; while(true) { printf("Please input\nn = "); scanf("%d", &bit); if(bit == 0) break; printf("\nShow %d Gray Code :\n", bit); int n = (1 << bit); for(int i = 0; i < n; i++) for(int j = bit; j >= 1; j--) if((i / (1 << j)) & 1) printf("%d%c", judge ? 1 : 0, j == 1 ? '\n' : ' '); else printf("%d%c", judge ? 0 : 1, j == 1 ? '\n' : ' '); printf("\n"); } }
标签:格雷码简介与生成
原文地址:http://blog.csdn.net/tc_to_top/article/details/44202415