集合子集问题:

集合子集问题:

给的一个集合按元素个数列出所有列出所有集合子集,如:

{1,2,3}

0个元素:{}

1个元素:{1},{2},{3}

2个元素:{1,2},{1,3},{2,3}

3个元素:{1,2,3}

输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}

方法:

采用一个二进制数列表示解,如:[000]代表{},[100]代表{1}

算法:

1、一个字符串数组存储解。

2、用一个整形数组存储不同元素个数解应反正字符串数组中得位置。

代码:

#include<iostream>

#include<cmath>

usingnamespace std;

 

intCOrder(int n,int a)

//排列数,n个中选a个的总数

{

       int i,a1=1,a2=1;

       for(i=n-a+1;i<=n;i++)

              a1*=i;

       for(i=2;i<=a;i++)

              a2*=i;

       return a1/a2;

}

 

intBitString(int num,char c[],int n)

//将num转换为2进制字符串存储于c中,返回c中'1'的个数

{

       int i,k=0;

       for(i=n-1;i>=0;i--)

       {

              if(num%2==0)

              {

                     c[--n]='0';

              }

              else

              {

                     k++;

                     c[--n]='1';

              }

              num/=2;

       }

       return k;

}

 

voidBitOrder(int n,char ***c)

{

       *c=new char*[pow(2,n)];

       //a用于存储不同元素个数的位置

       int *a=new int[n],i,k;

       a[0]=0;

       a[1]=1;

       for(i=2;i<=n;i++)

              a[i]=a[i-1]+COrder(n,i-1);

       for(i=0;i<pow(2,n);i++)

       {

              char *temp=new char[n+1];

              temp[n]=0;

              k=BitString(i,temp,n);

              (*c)[a[k]++]=temp;

       }

}

 

intmain()

{

       char **c;

       int n=3;

       BitOrder(n,&c);

       for(int i=0;i<pow(2,n);i++)

       {

              cout<<c[i]<<endl;

       }

       return 0;

}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值