每日一算法:产生可能的集合(二)

产生可能的集合
说明
给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,
则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。


 如果要产生字典顺序,例如若有4个元素,则:
{} => {1} => {1,2} => {1,2,3} => {1,2,3,4} =>
{1,2,4} =>
{1,3} => {1,3,4} =>
{1,4} =>
{2} => {2,3} => {2,3,4} =>
{2,4} =>
{3} => {3,4} =>
{4}
简单的说,如果有n个元素要产生可能的集合,当依序产生集合时,如果最后一个元素是n,
而倒数第二个元素是m的话,例如:{a b c d e n}
则下一个集合就是{a b c d e+1},再依序加入后续的元素。
例如有四个元素,而当产生{1 2 3 4}集合时,则下一个集合就是{1 2 3+1},
也就是{1 2 4},由于最后一个元素还是4,所以下一个集合就是{1 2+1},也就是{1 3},

接下来再加入后续元素4,也就是{1 3 4},由于又遇到元素4,所以下一个集合是{1 3+1},也就是{1 4}。


#include <stdio.h>

#define MAXSIZE 20

int main()
{
	int set[MAXSIZE];
	int i,n,position = 0;
	printf("输入集合个数:");
	scanf("%d",&n);
	printf("{}");
	set[position] = 1;
	while (1)
	{
		printf("\n{%d",set[0]);//打印第一个元素
		for (i=1; i<= position; i++)
		{//打印各个位置上的元素
			printf(",%d",set[i]);
		}
		printf("}");
		if (set[position] < n)
		{//如果当前不是最大的元素
			set[position+1] = set[position] + 1;//下一个位置的元素值比当前大1
			position++;//继续后移
		}
		else if (position != 0)
		{//如果是最大元素且当前位置不是0,那么退回到前面一个元素,并将其值加1
			position--;
			set[position]++;
		}
		else
		{//否则跳出循环
			break;
		}
	}
	printf("\n");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值