1. 程式人生 > >每日一小練——按字典順序列出所有子集

每日一小練——按字典順序列出所有子集

上得廳堂,下得廚房,寫得程式碼,翻得圍牆,歡迎來到睿不可擋的每日一小練!

題目:按字典順序列出所有子集

內容:

請寫一個程式用字典順序把一個{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語言名題精選百則》