C 經典演算法題 格雷碼(Gray Code)

2021-10-02 06:20:16 字數 1625 閱讀 6572

gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任兩個數之間只有乙個位元值不同,例如以下為3位元的gray code:

000

001011

010110

111101

100

由定義可以知道,gray code的順序並不是唯一的,例如將上面的數列反過來寫,也是一組gray code:

100

101111

110010

011001

000

gray code是由貝爾實驗室的frank gray在2023年代提出的,用來在使用pcm(pusle code modulation)方法傳送訊號時避免出錯,並於2023年三月十七日取得美國專利。

由於gray code相鄰兩數之間只改變乙個位元,所以可觀 察gray code從1變0或從0變1時的位置,假設有4位元的gray code如下:

0000

0001

0011

0010

0110

0111

0101

0100

1100

1101

1111

1110

1010

1011

1001

1000

觀察奇數項的變化時,我們發現無論它是第幾個gray code,永遠只改變最右邊的位元,如果是1就改為0,如果是0就改為1。

觀察偶數項的變化時,我們發現所改變的位元,是由右邊算來第乙個1的左邊位元。

以上兩個變化規則是固定的,無論位元數為何;所以只要判斷位元的位置是奇數還是偶數,就可以決定要改變哪乙個位元的值,為了程式撰寫方便,將陣列索引 0當作最右邊的值,而在列印結果時,是由索引數字大的開始反向列印。

將2位元的gray code當作平面座標來看,可以構成乙個四邊形,您可以發現從任一頂點出發, 繞四邊形周長繞一圈,所經過的頂點座標就是一組gray code,所以您可以得到四組gray code。

同樣的將3位元的gray code當作平面座標來看的話,可以構成乙個正立方體,如果您可以從任一頂點出發,將所有的邊長走過,並不重複經過頂點的話,所經過的頂點座標順序之組合也就是一組gray code。

#include

#include

#define maxbit 20

#define true 1

#define change_bit(x) x = ((x) == '0' ? '1' : '0')

#define next(x) x = (1 - (x))

intmain

(void

)printf

("\n"

); odd = true;

while(1

)for

(i = bits -

1; i >=

0; i--

)printf

("%c"

, digit[i]);

printf

("\n");

next

(odd);}

return0;

}

生成格雷碼C

題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 返回的格雷碼個數一共為2 n,2的n次方 例如 n 1,返回 ...

演算法實驗 格雷碼問題

實驗 遞迴演算法設計與應用 一.基本原理的概括 遞迴是一種重要的程式設計方法。使用遞迴方法有時可使演算法簡潔明瞭,邏輯清晰,易於設計。遞迴指演算法自己呼叫自己,有直接遞迴與間接遞迴兩種。遞迴方法用於解決一類滿足遞迴關係的問題。即 對原問題的求解可轉化為對其性質相同的子問題的求解。二.該類演算法設計與...

自動生成格雷碼演算法

典型的二進位制格雷碼 binary gray code 簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為 格雷碼 gray code 另外由於最大數與最小數之間也僅一位數不同,即 首尾相連 因此又稱 迴圈碼或 反射碼。自動生成格雷碼的演算法主要利用以下規則 1....