生成組合物件之二進位制反射格雷碼(c++)
binary reflected Gray code
二進位制反射格雷碼
虛擬碼描述
BRGC(n)
//遞迴生成n位的二進位制反射格雷碼
//輸入:一個正整數n
//輸出:所有長度為n的格雷碼位串列表
if n=1,表L包含位串0和位串1
else 呼叫BRGC(n-1)生成長度為n-1的位串列表L1
把表L1倒序後複製給表L2
把0加到表L1中的每個位串前面
把1加到表L2中的每個位串前面
把表L2新增到表L1後面得到表L
return L;
難點
在我看來這裡的難點主要是
1.位串和表的儲存結構
2.位串的動態新增
3.倒序複製操作
解決辦法
1.因為位串需要動態新增位數,並且需要在前方新增,因此使用list,表需要進行倒序複製,也可以使用list,但是為了避免混淆,這裡使用vector
2.使用了list之後新增就很方便了
3.使用vector的反向迭代器進行倒序複製
#include <vector>
#include <list>
typedef vector<list<int>> VList;
VList BRGC(int n)
{
VList L;
if (n == 1)
{
list<int> zero,one;
zero.push_front(0);
one.push_front(1);
L.push_back(zero);
L.push_back(one);
}
else
{
VList L1;
L1 = BRGC(n - 1);
//使用list的接受迭代器範圍的建構函式初始化L2
VList L2(L1.rbegin(), L1.rend());
for(VList::iterator beg=L1.begin();beg!=L1.end();beg++)
{
(*beg).push_front(0);
}
for (VList::iterator beg = L2.begin(); beg != L2.end(); beg++)
{
(*beg).push_front(1);
}
L.insert(L.end(), L1.begin(), L1.end());
L.insert(L.end(),L2.begin(), L2.end());
}
return L;
}
int main()
{
int n;
cout << "please input the length of bit string :";
cin >> n;
VList L = BRGC(5);
int count = 0;
for each (list<int> var in L)
{
for each (int bit in var)
{
cout << bit;
}
cout << "\n";
count++;
}
cout <<"總位串數為:"<< count<<endl;
system("pause");
return 0;
}
總結
出現了一些小問題
1.錯用list的建構函式
BitString zero(0)
BitString one(1)
不能這樣用這個是用來分配儲存空間的,這裡表示分配0個int型儲存空間,導致後面zero的容量為0,one的容量為1,並且其值被預設初始化為0
2.錯用for each(已修正)
for each裡的引數都是拷貝複製過來的,導致位串的位數總是1,因為再foreach裡新增位數之後那個臨時位串就被銷燬了,沒有對原位串造成任何改變
相關文章
- verilog實現格雷碼和二進位制碼的相互轉換
- 位,位元組,二進位制,十六進位制間的關係
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- mysql 日誌之二進位制日誌MySql
- C++輸入十進位制數,輸出對應二進位制數、十六進位制數C++
- java之二進位制與資料型別Java資料型別
- c++的進位制轉換C++
- c++ 16進位制輸出C++
- 16進位制字串轉位元組字串
- 進位制詳解:二進位制、八進位制和十六進位制
- 演算法學習之二進位制的妙用演算法
- JavaScript 生成十六進位制顏色值JavaScript
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- js二進位制和十進位制轉換程式碼JS
- 位元組流轉16進位制字串字串
- ASCII碼是幾位二進位制碼?ASCII
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- 隨機生成十六進位制顏色值程式碼例項隨機
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- Qt進位制轉換(十進位制轉十六進位制)QT
- Java 基於上傳的jar進行反射生成物件JavaJAR反射物件
- 1161:轉進位制(C C++)C++
- c++ 16進位制資料轉doubleC++
- c++ 二進位制儲存檔案C++
- c/c++各種進位制輸出C++
- C++實現進位制轉換工具C++
- 1474 十進位制轉m進位制+1475 m進位制轉十進位制
- 十進位制轉換為十六進位制和二進位制程式碼例項
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機
- C# 2進位制、8進位制、10進位制、16進位制...各種進位制間的輕鬆轉換C#
- n進位制轉十進位制
- 十進位制轉十六進位制