上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!
题目:列出所有子集
内容:写一个程序,列出{1,2,3,4,...,n}这个集合的所有子集,包括空集{ }。
解决这个问题的算法应该有很多种,不过我发现了一种很简单也很好玩的方法,就是用二进制表示几何元素的方法
比如如果n是3,则子集有(不包括空集){1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}就是1*{0,1}and2*{0,1}and3{0,1}每个组合出现一次,所以也可以看成是{0,0,1}{0,1,0}{0,1,1}{1,0,0}{1,0,1}{1,1,0}{1,1,1}所以就可以看成是二进制不断加一。
我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神。。奥,不对就解决了!
#include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { void showSubset(int n); int n; cout << "请输入一个n:"; cin >> n; cout << endl; cout << "求出子集的结果为:" << endl; showSubset(n); getchar(); getchar(); return 0; } void showSubset(int n) { //n += 1; int Subset[1000] = { 0 }; int i, j; cout << "{ }" << endl; while (true) { for (i = 0; i < n && Subset[i] == 1; Subset[i] = 0, i++); if (i == n) break; else { Subset[i] = 1; } cout << "{ "; for (j = 0; j < n; j++) { if (Subset[j] == 1) { cout << j+1 << " "; } } cout << "}"; cout << endl; } }
最后感谢 @daiweifeng 同学在 《快速Fibonacci数算法》中给我的提示。
欢迎大家加入每日一小练,嘿嘿!
每天练一练,日久见功夫,加油!
-End-
参考文献:《c语言名题精选百则》
原文地址:http://blog.csdn.net/zhurui_idea/article/details/26706241