📄 格雷码.cpp
字号:
#include <stdio.h>
int a[1024][10];//定义一个二维数组,用来存放格雷码,下标1存放格雷码的个数
//下标2存放格雷码的长度
void forecode(int x,int y,int n)//函数的功能为使长度为n的所有格雷码的前半部分
{ int i,j; //存放在相应的二维数组中
for(i=0;i<=y;i++)
for(j=n-2;j>=0;j--)
a[i][j+1]=a[i][j];//双重循环使n-1的格雷码都后移一位
for(i=0;i<=y;i++)
a[i][0]=0; //前半部分格雷码的第0位均为0
}
void backcode(int x,int y,int n)//使所有格雷码的后半部分存放在相应的数组中
{int i,j,m=1;
for (i=0;i<n;i++)
m=2*m; //m为格雷码的个数
for(i=0;i<=x-1;i++)
for(j=1;j<=n-1;j++)
a[m-i-1][j]=a[i][j];//后半部分格雷码从第1位到n-1位和前半部分对应相同
for(i=x;i<m;i++) //对应关系:第i行=第n-i-1行
a[i][0]=1; //后半部分第0位均为1
}
void graycode(int n)
{int i,k,m=1; //格雷码的生成
if (n==1)
{ a[0][0]=0;
a[1][0]=1;
}
else graycode(n-1);//递归调用本函数
for (i=0;i<n;i++)
m=2*m;
k=m/2;
forecode(0,k-1,n);
backcode(k,m-1,n);
}
void main() //主函数
{int i,j,n,m=1;
printf("请输入n的值:(n<=10)");
scanf("%d",&n); //输入n的值
for (i=0;i<n;i++)
m=2*m;
graycode(n);
for (i=0;i<m;i++)
{for (j=0;j<n;j++)
printf("%d",a[i][j]);//输出为n的格雷码
printf("\n"); //每输出一个后换行
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -