格雷碼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]);
}