产生一个集合的所有子集

/*
此解法通过不停的产生下一个集合来生成一个集合的所有子集
如要产生1~4的所有子集,如果当前集合是{1},下一个集合则是{1,2} ,{1,2,3},
{1,2,3,4} (set[position + 1] = set[position] + 1; position++)
下一个集合呢?即{1,2,4}(set[--position]++) 

*/
#include  <cstdio>
#include  <cstdlib>
#include  <iostream>
using namespace std;
#define   MAXSIZE      20
#define   LOOP          1
int main()
{
     int  set[MAXSIZE];
     int  n, i;
     int  position;
     char line[100];

     cin >> n;

     printf("\n{}");   
	 //init
     position      = 0;       
     set[position] = 1;  

     while (LOOP) {  
		 //output
          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; //不是set[position++]= set[position]+1
               position++;    
          }
          else if (position != 0)  
               set[--position]++;  
          else                
               break;         
     }
         
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值