每日一算法:产生可能的集合(一)
【摘要】 问题描述:产生可能的集合
说明
给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,
则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。
解法
如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,
并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字...
例如:000 => 100 => 010 => 110 => 001 => 101 => 011 => 111
-
#include <stdio.h>
-
-
#define MAXSIZE 20
-
-
int main()
-
{
-
int i,j,n;
-
char digit[MAXSIZE];
-
-
printf("输入集合个数:");
-
scanf("%d",&n);
-
for (i=0; i<n; i++)
-
{
-
digit[i] = '0';
-
}
-
-
printf("{}");//输出空集
-
-
while (1)
-
{
-
for (i=0; i<n && digit[i] == '1'; digit[i] = '0', i++);//找到第一个0,并将前面的1置为0
-
if (i == n)
-
{//如果全部为1,则查找结束,退出循环
-
break;
-
}
-
else
-
{//将找到的第一个0置为1
-
digit[i] = '1';
-
}
-
-
for (i=0; i<n && digit[i] == '0'; i++);//这一句貌似没用吧,i的值已经到了第一个1的位置啊???
-
printf("\n{%d",i+1);//打印
-
for (j=i+1; j<n; j++)
-
{//如果后面也有值为‘1’的位置,也打印
-
if (digit[j] == '1')
-
{
-
printf(",%d",j+1);
-
}
-
}
-
printf("}");
-
}
-
printf("\n");
-
return 0;
-
}
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/14088257
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)