大神,帮忙看看这个C程序。 输出格雷码的C语言程序。 如果错的太多,求大神给出 正确程序~谢谢

作者&投稿:那耿 (若有异议请与网页底部的电邮联系)
C语言用递归写,写一个生成格雷码的程序~

#include #include int n;char s[17];void dfs(int i){ if(i==n) printf("%s
",s); //到达底部就输出 else { dfs(i+1); //深度优先搜索 if(s[i]=='0') s[i]='1'; else s[i]='0'; //把当前位逆转 dfs(i+1); //继续向下搜索 }}int main(){ int i; while(1) { scanf("%d",&n); if(!n) break; for(i=0;i<17;i++) s[i]='0'; s[n]='\0'; dfs(0); printf("
"); } system("pause"); return 0;}

你查百科:
一般的,普通二进制码与格雷码可以按以下方法互相转换:
二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)

如果非要按递归来做,可以这样,如果要输出n位格雷码,那么递归层为N:0层负责第0位,1层负责第1位,2层负责第2位。。。。第n-1层负责第n-1位(也就是gray的最高位)这样就可以写出递归函数的轮廓了。
void gray(int n)
{
if(0==n)
{……;return;}
……
gray(n-1);//把处理第n-1位的任务交下一层处理

}
对于第0位来说,每4位为一个循环周期——01 10.
对于第1位来说,每8位为一个循环周期——0011 1100.
对于第2位来说,每16位为一个循环周期——00001111 11110000.
……
对于第N位来说,每2^(N+2)为一个循环周期。
看到这里你有什么启发?
所以我想你应该设置一个全局变量:int flag=1.
对于gray(i)函数来说,可以通过set=flag%(2^(i+2))来设置该第位(当2^i<set&&set<=3*2^i,就设第i位为1)

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define len sizeof(struct Dulnode)
#define null 0
typedef struct Dulnode
{
int e;
struct Dulnode *next;
struct Dulnode *front;
} Dulist;//定义一个结构体,代表双向链表的节点;
typedef Dulist* pList;
int create(pList * head)
{
int binary = 0;//二进制数字
printf("建立链表\n");
scanf_s("%d",&binary);
fflush(stdin);
if(binary == 1 || 0 == binary)
{
if(*head==NULL)
{
*head = (struct Dulnode*)malloc(sizeof(Dulnode));
}
(*head)->e = binary;
(*head)->front = NULL;
(*head)->next = NULL;
return 0;
}
return -1;

}

int insert(pList * pnext,pList * pfront,int b)
{
if(b == 1 || 0 == b)
{
if(*pnext==NULL)
{
(*pnext) = (struct Dulnode*)malloc(sizeof(Dulnode));
(*pnext)->e = b;
(*pnext)->front = *pfront;
(*pnext)->next = NULL;
return 0;
}
else
{
return insert(&((*pnext)->next),pnext,b);
}
}
return -1;
}

void BinaryGray(pList* phead)
{
if(!(*phead)->next)//尾节点格雷码
{
(*phead)->e^=(*phead)->front->e;
}
else
{
BinaryGray(&((*phead)->next));
if(!(*phead)->front)//首节点格雷码
(*phead)->e^=0;
else
(*phead)->e^=(*phead)->front->e;//中间节点格雷码

}
}
int main()
{
pList phead = NULL;

if(create(&phead)==-1)
{
printf("创建链表失败\n");
exit(0);
}

while(1)
{
int binary = 0;//二进制数字
scanf_s("%d",&binary);
fflush(stdin);

if(insert(&phead,NULL,binary) == -1)
break;
}

pList p = NULL;
for(p = phead;p!=NULL;p=p->next)
{
printf("%d",p->e);
}

printf("\n");

BinaryGray(&phead);
p = NULL;
for(p = phead;p!=NULL;p=p->next)
{
printf("%d",p->e);
}
}

我看了下格雷码。写了一个。不知道格雷码理解对不对。希望对你有帮助。

O.O
#include<stdio.h>
#include<malloc.h>
#define len sizeof(struct Dulnode)
#define null 0
typedefstruct Dulnode{
int e;
struct Dulnode *next;
struct Dulnode *front;
} Dulist;//定义一个结构体,代表双向链表的节点;
int i;
struct Dulnode *creat(void) // 建立一个双向链表;
{
struct Dulnode *head;
struct Dulnode *p1,*p2;
head=null;
i=0;
p1=p2=(struct Dulnode*)malloc(len);
scanf_s("%d",&p1->e);
head=null;
while(p1->e==0||p1->e==1)
{
i=i+1;
if(i==1)head=p1;
else {
p2->next=p1;
p1->front=p2;
};
p2=p1;
p1=(struct Dulnode*)malloc(len);
scanf("%d",&p1->e);
}
p2->next=null;
return head;
}
struct Dulnode * Gray(struct Dulnode *head)//二进制码转化为格雷码;
{
int j;
struct Dulnode *q1;
head=creat();
q1=head;
for(j=0;j<=i;j++)
q1=q1->next;
while(q1->e==0||q1->e==1)
{
if(q1->e==(q1->front)->e)
(q1->front)->e=0;
else (q1->front)->e=1;
q1=q1->front;
}
head=q1;
return(head);
}
void print(struct Dulnode *head)//输出一行二进制码;;
{
struct Dulnode *p;
printf("格雷码的序列:\n");
p=head;
if(head!=null)
do
{
printf("%d",p->e);
p=p->next;
}while(p!=null);
}
void main()
{
struct Dulnode *head;
printf("请输入二进制码:");
head=creat();
printf("转化为格雷码:");
head=Gray(head);
print(head);
}

基本上忘记完了。。。


C程序超时,麻烦大神帮忙看看
2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。所以这里为了效率就不要用递归了,用循环更好 把int f(int m)函数改下就可以了 int f(int m){ int i,x=1; for(i=1;i<=m;i++) x=x*i; return x;} PS:我对这个题的理解跟你的不一...

C语言试题,各位大神帮帮忙看看,急急急!!!
答案是 A 因为a是无符号整型(没有指定类型,默认是int),在32位机上无符号整型是2^32-1,在16位机上是2^16-1=65535,a的初始化值是32765是远远小于65535的,所以不要考虑补码呀什么的,直接加3就可以了。

c语言问题:求大神帮忙看一眼这个程序哪里有问题
这个问题关键在于计算闰年的个数,闰年比普通年份多了一天,所以最后天数直接加上闰年数就行了。(注意在循环时控制条件不用算当年是否为闰年,因为当年还没开始)以下是具体代码:include <stdio.h>#include<stdlib.h>main(){ int i,by,ty,r=0;long unsigned min;printf("Input your birth year...

C语言的大神帮我看看哪里写错了?
已经修改完成,运行通过:include <stdio.h> int isPrime(int x, int KnownPrimes[], int numberOfKnownPrimes );int main(void){ const int number=10;int prime [number]= {2};\/\/有修改 int count = 1;int i = 3;while ( count< number){ if(isPrime(i,prime,count)){ prime[count...

这个是c语言,求大神帮忙看看哪里错了,题目就是1到n中的奇数相加。_百度...
for 语句中的逗号改成分号。一般这种语法错误在下面的组建窗口中都有提示。

哪位大神帮我看看这个C语言的编程错在哪,老是出现负数。
x>y>z \/\/神操作。三个数,比较大小,逻辑错了\/\/这一个函数,void print(int a,int b,int c){ int max; if(a<b) { max=a; a=b; b=max; } if(a<c) { max=a; a=c; c=max; } if(b<c) { max=b; b=c; c=max; ...

大神来帮忙看看 这配置 玩魔兽世界卡吗 快玩说CPU不过关 帮忙看下玩...
楼主这个配置属于中端,玩魔兽世界是完全没问题的,只要网速跟得上流畅度不成问题。当然就配置“平均度”来说,你的CUP相对内存、显卡来说稍稍偏低,如果是四核CPU的话你的电脑可以直接划为高端,希望楼主采纳。

C盘太臃肿了,看了下,主要是2个文件夹太肥。大神帮忙看看,可以删除...
不能删除,是用户配置文件,如果删除,某些程序无法正常运行.application data 是应用程序资料、应用程序数据的意思,这个文件夹存储的是某些软件的MSI安装文件,一般不需要删除它们,因为有些软件运行时会对此有需要。如果你确实需要删除也可以,因为这里面的数据一般来说是用不到的,只是一个自动备份,但是...

C语言开关灯问题,麻烦大神们帮我看看这个程序哪里错了啊,结果不对...
两个错误:1、int a[6000]={1};这句。你这只是将a[0]赋值1,其他都是0,数组默认以0填充,应该改为:int a[6000];for(i=0;i<6000;i++)a[i]=1;2、第二层循环里:if(a[j]==0)a[j]=1;if(a[j]==1)a[j]=0;这个语句把所有的灯都关闭了,因为如果关了,就打开;打开后又...

初学编程,大家帮忙看下这道c语言题怎么做?万分感谢
printf("%c ", buff[i]);} puts("");puts("映射规则:");for (i = 0; i < maplen; i++) { printf("%c -> %d\\n", map[i], i);} puts("");} else if (maplen == -1) { puts("Different Chars count is OverLimit of 10");} else if (maplen <= -2) { prin...

连州市13145306740: 大神,帮忙看看这个C程序. 输出格雷码的C语言程序. 如果错的太多,求大神给出 正确程序~谢谢 -
车茗回春: O.O #include#include#define len sizeof(struct Dulnode)#define null 0typedefstruc...

连州市13145306740: 一个C语言程序,编译不出来,麻烦大神来看看,程序的输出结果最重要! -
车茗回春: 对着呢,这是输出.vc++6.0编译运行都通过

连州市13145306740: C语言输出菱形问题 -
车茗回春: #include int main(){ int center = 4;//列数输入在这里,控制图形大小 int x ,y; x = y = center ; for(int i = 1;ifor(int j = 2;jif(jelse x = 3 * center - 1; int temp = abs(j - x - 1) + abs(i - y); if(tempelse printf(" "); } printf("\n"); } return 0; }随手写的.应该没问题,center可以随便输入控制图形大小

连州市13145306740: 求助C语言大神,这个程序的输出怎么算,求详解! -
车茗回春: 楼主好 c=(a-=a-5),(a=b,b+3); 关键是这一句要理解清楚 逗号运算符比赋值运算优先级要低,所以(a-=a-5)计算之后值为5先赋值给c,之后才向下计算(a=b,b+3) b=0赋值给a,a=0,b+3不改变b的值,b=0.楼上的分析的是c= ( (a-=a-5),(a=b,b+3) );而不是c=(a-=a-5),(a=b,b+3);

连州市13145306740: C语言大神帮看,为什么输入1之后输出为空白 -
车茗回春: 程序有一点小BUG,第五行单引号应该变成双引号.除此之外是没问题的,输入1后会输出数字1,然后不换行,之后输出sum的值0,所以你看到的输出应该是10.但我猜测,你想要的效果可能不是这样,或许你可以在第五行输出中加上\n,在第六行else后和倒数第二行末尾分别添上左右大括号,看看这是不是你想要的.另外,之前那个回答不用太在意,他没看题目,批量复制骗采纳的.

连州市13145306740: 帮我看看这个程序哪错了,C语言
车茗回春: 输入输出的格式符用错了,应该是 scanf("%d,%d,%d",&a,&b,&c); 和 printf("a=%d,b=%d,c=%d",a,b,c);

连州市13145306740: C语言求大神帮我看一下代码,题目是输出数列每行最大的数和它们的和,要用指针 -
车茗回春: 第11行: for(j=0;j<m;j++) {if ( *(*(p+i)+j) > value) /* <- 这里你用的是一个*,已经改成两个 */value=*(*(p+i)+j); }二维数组取地址要取两次. 话说把a[i][j]这么简单的形式搞那么复杂有必要吗?而且你在输入的时候用了x++,这个也不太好.因为不同编译器对于多维数组在内存中的存储形式可能不一样,万一25个int数据不连在一起怎么办.

连州市13145306740: 请大神帮我看看这个C语言,除了#define PI PA后不需要分号,还有哪里有错啊?求告知 -
车茗回春: 看看编译器输出 应该是溢出 用double试试 不要用VC6 下个VS2013

连州市13145306740: 求C语言大神帮忙看个小程序,输出最长字符串 -
车茗回春: #include#include int main() {char s1[80] = {0},max[80] = {0}; gets(s1); while(strcmp(s1,"stop")!=0) { if (strlen(max){ strcpy(max,s1); } gets(s1); } if (strlen(max){ strcpy(max,s1); } printf("%s\n",max); return 0; }结果如下:

连州市13145306740: c语言程序出错了,大神帮忙看看呗,大谢~~(题:输入三个字符串,按由小到大顺序输出) -
车茗回春: “void exchange(char *pt1,char*pt2,char*pt3);”这句声明与下面的“void excange(char *pt1,char*pt2,char*pt3)”函数名的说明不一...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网