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

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

题目:列出所有子集

内容:写一个程序,列出{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语言名题精选百则》

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

时间: 2024-08-11 08:26:34

每日一小练——列出所有子集的相关文章

每日一小练——列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:列出全部子集 内容:写一个程序,列出{1,2,3,4,...,n}这个集合的全部子集,包含空集{ }. 解决问题的算法应该有非常多种,只是我发现了一种非常easy也非常好玩的方法,就是用二进制表示几何元素的方法 比方假设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,2,3,4,...,n}集合的全部子集找出来. 解答: 想必我就不用解释什么是字典顺序了,作为乘虚猿和攻城狮大家应该懂得,无论你懂不懂,反正我懂了! 事实上我们能够先列出一个实例,观察规律: 比如n=3 {1} {1,2} {1,2,3} {1,3} {2} {2,3} {3} 能够看出这种规律(假设你说我怎么没看出来,事实上你能够再多看一会!) 令一个

每日一小练——按字典顺序列出所有子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出所有子集 内容: 请写一个程序用字典顺序把一个{1,2,3,4,...,n}集合的所有子集找出来. 解答: 想必我就不用解释什么是字典顺序了,作为乘虚猿和攻城狮大家应该懂得,不管你懂不懂,反正我懂了! 其实我们可以先列出一个实例,观察规律: 例如n=3 {1} {1,2} {1,2,3} {1,3} {2} {2,3} {3} 可以看出这样的规律(如果你说我怎么没看出来,其实你可以再多看一会!) 令一个指

每日一小练——按字典顺序列出所有排列

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出所有排列 内容:请写一个程序,用字典顺序列出n个元素的所有排列 这个问题有点小复杂,不是太好想,反正我是想了好久. 看到这个题目我先是想到的就是递归因为这个题目就是用指针对高位选择,然后将指针传给临近的低位再选择. 不过仔细研究原来没这么简单.以n=4举例当处理以1开头的排列时1234到1432,但是在排列2开头的时候不太好建立统一的递归关系.(没办法太统一的递归方法中将后面的数字选出来),所以将第一位分

每日一小练——按字典顺序列出全部排列

上得厅堂,下得厨房,写得代码,翻得围墙.欢迎来到睿不可挡的每日一小练! 题目:按字典顺序列出全部排列 内容:请写一个程序,用字典顺序列出n个元素的全部排列 这个问题有点小复杂,不是太好想.反正我是想了好久. 看到这个题目我先是想到的就是递归由于这个题目就是用指针对高位选择,然后将指针传给临近的低位再选择. 只是细致研究原来没这么简单. 以n=4举例当处理以1开头的排列时1234到1432,可是在排列2开头的时候不太好建立统一的递归关系. (没办法太统一的递归方法中将后面的数字选出来),所以将第一

每日一小练——最长平台问题

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:最长平台问题 内容:一直一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串同样的元素.而且这个元素不能再延伸. 比如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,3,4,5,5,6都是平台.试编写一个程序,接受一个数组,把这个数组中最长的平台找出来.在这个样例中, 3,3,3就是该数组的中的最长的平台. 说明: 这个程序十分简单,可是编写好却不easy,因此在编敲代码时应注意考虑以下几点:

每日一小练——快速Fibonacci数算法

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:快速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有如下规律: 尝试寻找快速的求出fn的方法 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了! 其实题目中就给出了这个算法的递归形式,所以首先我想到的是递归解法,不过因为求解快速方法在递归之前,我编写了一个非递归的算法 #include <iostream> usi

每日一小练——求质数

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:求质数 内容: 试编写一个程序,找出前N个质数.如果没有进一步要求,这不是难题.但在此希望从所知的.使用除法的方法中,用最快的办法来编写程序. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!这个题目确实很简单,先看看常规解法吧! #include <iostream> #include <math.h> #define endNum 200 using

每日一小练——等值首尾和

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:等值首尾和 内容: 假设有一个数组x[],它有n个元素,每一个都大于零:称x[0]+x[1]+...+x[i]为前置和,而x[j]+x[j+1]+...+x[n-1]为后置和.试编写一个程序,求出x[]中有多少组相同的前置和后置和. 例如:x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,即3,9,11,12,16,21,23:后置和则2,7,11,12,14,20,23; 于是11,12,23,