每日一小練——按字典順序列出所有子集
阿新 • • 發佈:2019-02-07
上得廳堂,下得廚房,寫得程式碼,翻得圍牆,歡迎來到睿不可擋的每日一小練!
題目:按字典順序列出所有子集
內容:
請寫一個程式用字典順序把一個{1,2,3,4,...,n}集合的所有子集找出來。
解答:
想必我就不用解釋什麼是字典順序了,作為乘虛猿和攻城獅大家應該懂得,不管你懂不懂,反正我懂了!
其實我們可以先列出一個例項,觀察規律:
例如n=3
{1}
{1,2}
{1,2,3}
{1,3}
{2}
{2,3}
{3}
可以看出這樣的規律(如果你說我怎麼沒看出來,其實你可以再多看一會!)
令一個指標指向第一個元素,如果指標指向的元素小於n就使指標加一,後指標指向元素等於指標指向前一個元素加一。當指標指向元素等於n時,指標回指一位即指標減一,指標指向元素加以,當指標指向位置為初始位置時,指向元素等於n則輸出結束了。
其實這個規律也不是觀察例項得出的,這就是我們在按字典排序時做的事情,只不過人的大腦速度太快,很多過程一步到位而已,如果不信,你拿出一本字典慢慢嘗試看看是不是這樣的!
我的解法:上來沒多想,開啟vs2013就敲了起來,問題果然很簡單,分分鐘就超神。。奧,不對就解決了!
實驗結果:#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { void subsetInDic(int n); int n; cout << "請輸入一個n:"; cin >> n; cout << endl; cout << "求出子集按字典順序排列的結果為:" << endl; subsetInDic(n); getchar(); getchar(); return 0; } void subsetInDic(int n) { int i,j,set_Index = 0; int subsetNum[1000]; subsetNum[set_Index] = 1; cout << "{ }" << endl; while (true) { cout << "{ "; for (i = 0; i <= set_Index; i++) cout << subsetNum[i] << " "; cout << "}"; cout << endl; if (subsetNum[set_Index] < n) { subsetNum[set_Index + 1] = subsetNum[set_Index] + 1; set_Index++; } else if (set_Index != 0) subsetNum[--set_Index] += 1; else break; } }
最後感謝 @hikean
同學在 《列出所有子集》中給給出的更簡便,效率更快的方法。歡迎大家能給出更好的方法!
歡迎大家加入每日一小練,嘿嘿!
每天練一練,日久見功夫,加油!
-End-
參考文獻:《c語言名題精選百則》