格雷码生成算法:
首先给定基本的序列:0,1
生成长度为2的格雷码的方法为:在0,1之前加上0,构成00,01,在0,1的逆序列1,0之前加1,构成11,10,合并二者得到00,01,11,10。以此类推,可求得长度为n的格雷码。
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
void Reverse(string str[],int n)
{
int j=n/2;
int i=n/2-1;
for(;j<n;i--,j++)//从中间位置对称摆放
{
str[j]=str[i];
}
}
void GrayCode(string *STR,int n)
{
if(n==1)
{
STR[0]="0";
STR[1]="1";
return;
}
else
{
GrayCode(STR,n-1);
int num=pow(2,n);
int semi=num/2;
Reverse(STR,num);
for(int i=0;i<semi;i++)
{
STR[i].insert(0,"0");//前半部分添0
}
for(int j=semi;j<num;j++)
{
STR[j].insert(0,"1");//后半部分添1
}
}
}
void main()
{
cout<<"请输入您的格雷码长度: "<<endl;
int Length;
cin>>Length;
int Num=pow(2,Length);//格雷码的个数
string *STR=new string[Num];//动态申请保存格雷码的空间
GrayCode(STR,Length);
for(int i=0;i<Num;i++)//输出格雷码
{
cout<<STR[i]<<" ";
if((i+1)%10==0)
cout<<endl;
}
cout<<endl;
}