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

来源:互联网 发布:软件开发是什么? 编辑:程序博客网 时间:2024/06/07 02:22
产生可能的集合
说明
给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定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 20int 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;//下一个位置的元素值比当前大1position++;//继续后移}else if (position != 0){//如果是最大元素且当前位置不是0,那么退回到前面一个元素,并将其值加1position--;set[position]++;}else{//否则跳出循环break;}}printf("\n");return 0;}


原创粉丝点击