典型的二進位制格雷碼(binary gray code)簡稱格雷碼,
在一組數的編碼中,若任意兩個相鄰的**只有一位二進位制數不同,則稱這種編碼為
格雷碼(gray code),另外由於最大數與最小數之間也僅一位數不同,即「首尾相連」,因此又稱
迴圈碼或
反射碼。
自動生成格雷碼的演算法主要利用以下規則:
1. 1位格雷碼有兩個碼字。
2. (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加字首0。
3. (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加字首1。
4. (n+1)位格雷碼的集合 = n位格雷碼集合(順序)加字首0 + n位格雷碼集合(逆序)加字首1。
簡而言之,就是
後面的格雷碼等於其相鄰的前面的格雷碼
按順序書寫,加字首0,再按逆序書寫,加字首1
。如下圖所示:
按照這個思路很容易的實現**:
[cpp]view plain
copy
void
generatergraycode(
intn)
//在前面產生的n-1位格雷碼前面新增一位數0產生2^(n-1)個n位格雷碼,並替換掉原來的n-1位格雷碼
inttempgraycodevecsize = tempgraycodevec.size();
for(
intj = 0; j
//將前面產生的n-1位格雷碼的順序反轉
//在反轉後的n-1位格雷碼前面新增一位數1產生剩下2^(n-1)個n位格雷碼,並儲存起來
for(
intjj = tempgraycodevecsize-1; jj >= 0; jj--)
//釋放掉臨時儲存空間
tempgraycodevec.clear();
} }
//輸出n位格雷碼
for(
size_t
i = 0; i
cout <
}
自動生成格雷碼
出處 blog.csdn.net beiyeqingteng 問題 產生n位元的所有格雷碼。格雷碼 gray code 是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數字,任兩個數之間只有乙個位元值不同。例如以下為3位元的格雷碼 000 001 011 010 110 111 10...
也談自動生成格雷碼演算法
工作10年了,總覺得自己是不是應該學點什麼。今天突發奇想,是不是可以用程式來自動生成格雷碼?其實只要看懂了這張圖,格雷碼的編譯碼都是小菜一碟。格雷碼的每乙個位其實都是對應二進位製碼的位跟其較高位的異或。簡單說就是g0 b1 b0 拿起gcc就開始寫,編碼函式就這麼完成了。int grayencode...
生成格雷碼
程式設計題 生成格雷碼 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 思想 用遞迴法實現,把求n位格雷碼分解為求n 1...