每日一小练——按字典顺序列出全部子集
上得廳堂,下得廚房,寫得代碼,翻得圍墻,歡迎來到睿不可擋的每日一小練!
題目:按字典順序列出全部子集
內容:
請寫一個程序用字典順序把一個{1,2,3,4,...,n}集合的全部子集找出來。
解答:
想必我就不用解釋什么是字典順序了,作為乘虛猿和攻城獅大家應該懂得,無論你懂不懂,反正我懂了!
事實上我們能夠先列出一個實例,觀察規律:
比如n=3
{1}
{1,2}
{1,2,3}
{1,3}
{2}
{2,3}
{3}
能夠看出這種規律(假設你說我怎么沒看出來,事實上你能夠再多看一會!)
令一個指針指向第一個元素,假設指針指向的元素小于n就使指針加一,后指針指向元素等于指針指向前一個元素加一。當指針指向元素等于n時,指針回指一位即指針減一,指針指向元素加以,當指針指向位置為初始位置時,指向元素等于n則輸出結束了。
事實上這個規律也不是觀察實例得出的,這就是我們在按字典排序時做的事情,僅僅只是人的大腦速度太快,非常多過程一步到位而已,假設不信,你拿出一本字典慢慢嘗試看看是不是這種!
我的解法:上來沒多想,打開vs2013就敲了起來,問題果然非常easy,分分鐘就超神。。奧,不正確就攻克了!
#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;elsebreak;} }
最后感謝 @hikean 同學在 ?《列出全部子集》中給給出的更簡便,效率更快的方法。歡迎大家能給出更好的方法!
歡迎大家添�每日一小練,嘿嘿!
每天練一練,日久見功夫,加油!
? ????? ? ??-End-
參考文獻:《c語言名題精選百則》
轉載于:https://www.cnblogs.com/hrhguanli/p/3774800.html
總結
以上是生活随笔為你收集整理的每日一小练——按字典顺序列出全部子集的全部內容,希望文章能夠幫你解決所遇到的問題。