格雷码c语言
#include <iostream.h>
void main()
{
cout<<"第一行对应的是十进制自然数"<<endl;
int a[16],gray_code[64]={0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,0,0,1,1,0,0,0};
for(int i=0;i<16;i++)
{
a[i]=i;
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"第二行是格雷码"<<endl;
for(i=0;i<4;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=4;i<8;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=8;i<12;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=12;i<16;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=16;i<20;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=20;i<24;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=24;i<28;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=32;i<36;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=40;i<44;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=44;i<48;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=48;i<52;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=52;i<56;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=56;i<60;i++)
{
cout<<gray_code[i];
}
cout<<" ";
for(i=60;i<64;i++)
{
cout<<gray_code[i];
}
cout<<endl;
}
搞错了,我是用C++来做的,C++跟C的分别就是那些输入输出不同而已.楼主自己改吧
⑵ c语言实现格雷码转换为二进制
把十进制小数乘以2,取其积的整数部分作对应二进制小数的最高位系数k -1 再取积的纯小数部分乘以2,新得积的整数部分又作下一位的系数k -2 ,再取其积的纯小数部分继续乘2,…,直到乘积小数部分为0时停止,这时乘积的整数部分是二进制数最低位系数,每次乘积得到的整数序列就是所求的二进制小数。这种方法每次乘以基数取其整数作系数。所以叫乘基取整法。需要指出的是并不是所有十进制小数都能转换成有限位的二进制小数并出现乘积的小数部分0的情况,有时整个换算过程无限进行下去。此时可以根据要求并考虑计算机字长,取定长度的位数后四舍五入这时得到的二进制数是原十进制数的近似值。
⑶ 格雷码的程序实现
根据格雷码的特点,即:对于两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数间也仅有一个二进制位不同。以下给出用长度n的二进制数来表示十进制数m的格雷码c实现,运行结果如右图所示: #include<stdio.h>voidmain(){intm,n,i,j,b,p,bound;intgr[14];//输入n,m并判断m是否合法bound=1;printf("Pleaseinputtwonumber:n,m ");scanf("%d,%d",&n,&m);for(i=1;i<=n;i++)bound*=2;if(m<0||m>=bound){printf("Dataerror!");exit(0);}b=1;for(i=0;i<n;i++){p=0;b*=2;for(j=0;j<=m;j++){if(j%b-b/2==0)p=1-p;}gr[i]=p;}printf("m=");for(i=n-1;i>=0;i--){printf("%d",gr[i]);}printf(" ");}格雷码解码的Pascal 程序: varx,y,i:longint;beginreadln(x);fori:=30downto0dobeginy:=(xand(1shli))xor((xand(1shl(i+1)))shr1);x:=xandnot(1shli)ory;end;writeln(x);end.2varx,i,n:longint;beginreadln(n);x:=n;fori:=1to31dobeginx:=xshr1;n:=nxorx;end;writeln(n);end.
⑷ 求帮助 用c语言编制程序 格雷码转换为自然二进制码
public:
MGraph(int mSize, const T& noedg);
~MGraph();
ResultCode Insert(int u, int v, T &w);
ResultCode Remove(int u, int v);
bool Exist(int u, int v) const;
int Vertices() const { return n; }
void Output();
protected:
⑸ 大神,帮忙看看这个C程序。 输出格雷码的C语言程序。 如果错的太多,求大神给出 正确程序~谢谢
#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);
}
}
我看了下格雷码。写了一个。不知道格雷码理解对不对。希望对你有帮助。
⑹ C语言 递归 输出格雷码(Gray码)
C语言
递归
输出格雷码如下:
#include
<stdio.h>
#include
<stdlib.h>
int
n;
char
s[17];
void
dfs(int
i)
{
if(i==n)
printf("%s\n",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("\n");
}
system("pause");
return
0;
}
⑺ c语言编程作业 急求 (读取2进制文件 输出16进制)万分感谢
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int
main(int
argc,
char
*argv[])
{
char
aa[]
=
"0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111";
char
bb[20];
char
cTmp[5];
int
tmp
=
0;
char*
p
=
NULL;
memset(bb,
0x00,
sizeof(bb));
memset(cTmp,
0x00,
sizeof(cTmp));
p
=
aa;
sscanf(p,
"%[0,1]",
cTmp);
while(NULL
!=
(p
=
strstr(p,
cTmp)))
{
sprintf(bb,
"%s%X",
bb,
strtoul(cTmp,0,2));
p
=
p
+
strlen(cTmp)
+
1;
sscanf(p,
"%[0,1]",
cTmp);
}
printf("%s",
bb);
}
大概就是这么一个思路,主要用到的就是strtoul函数。
你改成fscanf估计就好使。
⑻ 两道C语言编程题题,求解!
(1)
#include <stdio.h>
void main(){
int i,j,n,K;
char s[100],x;
scanf("%d",&n);
for (j=0;j<n;j++){
scanf("%d\n",&K);
gets(s);
for (i=0;i<strlen(s);i++) {
x = s[i];
if ( (s[i] >= 'a') && (s[i] <= 'z') ) {
x = s[i]+K;
if (x > 'z') x = x - 26;
if (x < 'a') x = x + 26;
};
if ( (s[i] >= 'A') && (s[i] <= 'Z') ){
x = s[i]+K;
if (x > 'Z') x = x - 26;
if (x < 'A') x = x + 26;
}
printf("%c",x); };
printf("\n");
};
exit(0);
}
(2)
题意不清,是不是输入数在0-15之间。也就是4bit数。否则什么叫“最高位”?
只有4bit,也就是不必去做位运算,查表code[16][5]就可以了。
#include <stdio.h>
void main(){
int d;
char code[16][5]={"0000","0001","0011","0010","0110","0111",
"0101","0100","1100","1101","1111","1110",
"1010","1011","1001","1000"};
printf("input n\n");
scanf("%d",&d);
printf("%s",code[d]);
}