答案不标准也不一定是最佳,仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int SearchFlag(char *flag)
{
int i;
int ee = sizeof(flag);
for(i=0 ; i<ee; i++)
{
if(flag[i] == 0)
return 1;
}
return 0;
}
int SearchValue(int e,int n)
{
int i,s=1;
if(e == 0)
return 1;
if(s == e)
return 1;
for(i=0 ; i<n; i++)
{
s*=2;
if(s == e)
return 1;
if(s > e)
return 0;
}
return 0;
}
char* ToXBase(int x,unsigned int n,char *s)
{
int i=0,j;
char ch;
while(x >= n)
{
itoa(x%n,&s[i],33);
x=x/n;
i++;
}
itoa(x%n,&s[i],33);
for(j=0;j<i;i--,j++)//前后交换
{
ch=s[j];
s[j]=s[i];
s[i]=ch;
}
return s;
}
void GenGrayNbit(int i32BitNum)
{
unsigned int i;
unsigned int n=1;
char s[33];
for(i=0 ; i<i32BitNum ; i++)
{
n *=2;
}
int GrayNow,GrayLast=0;
char *flag = new char[n];
for(i=0 ; i< n; i++)
{
flag[i]=0;
}
for(GrayNow=0 ; SearchFlag(flag) ; )
{
int e=GrayLast^GrayNow;
if((SearchValue(e,n)) && (flag[GrayNow]==0))
{
ToXBase(GrayNow,2,s);
for(unsigned int j=0 ; j< i32BitNum -strlen(s) ; j++)
{
printf("%d",0);
}
printf("%s ",s);
flag[GrayNow]=1;
GrayLast = GrayNow;
}
GrayNow++;
if(GrayNow > n)
GrayNow = 0;
}
printf("/n");
}
void main()
{
GenGrayNbit(2);
printf("/n");
GenGrayNbit(3);
printf("/n");
GenGrayNbit(4);
printf("/n");
GenGrayNbit(5);
printf("/n");
GenGrayNbit(6);
printf("/n");
GenGrayNbit(1);
}
以上程序在判断相邻格雷码是否只有一位不一样这个问题时候,效率不高,有更加高效的方法,欢迎评论~~~
完整内容所在目录:http://www.mythroad.net/tag/q_written_examination_and_interview_code_title/