码迷,mamicode.com
首页 > 其他好文 > 详细

每日一小练——列出所有子集

时间:2014-05-26 05:00:34      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:vs   学习   每日一小练   算法   集合问题   

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!


题目:列出所有子集


内容:写一个程序,列出{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;
	}

}

实验结果:


bubuko.com,布布扣


最后感谢 @daiweifeng 同学在  《快速Fibonacci数算法》中给我的提示。


欢迎大家加入每日一小练,嘿嘿!

每天练一练,日久见功夫,加油!


            -End-

参考文献:《c语言名题精选百则》


每日一小练——列出所有子集,布布扣,bubuko.com

每日一小练——列出所有子集

标签:vs   学习   每日一小练   算法   集合问题   

原文地址:http://blog.csdn.net/zhurui_idea/article/details/26706241

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!