求一个集合的所有子集

一个集合的所有子集等于2^该集合的长度。比如{c,b,a}的长度为3,这个集合的子集就有8个。
这句话看起来很简单,但同时也隐含着高深的哲理。其实一个集合的所有集合,和2^该集合的长度这个数字有关。比如上面的例子,{c,b,a}的长度为3,则可以用0-7表示其所有子集。如下所示,改数字所对应的位置为1,则说明我需要这个数字形成子集。从0-7的二进制表示,刚好代表完,一个长度为3,子集个数为8的所有子集。
0(000):{}
1(001):{a}
2(010):{b}
3(011):{ab}
4(100):{c}
5(101):{a,c}
6(110):{b,c}
7(111):{a,b,c}

进行一个2^n的循环,比如 当取i=3时 3&1为1,所以把a加进去,然后3进行右移一位为1,1&1为1,所以把b加进去,然后1右移一位为0,循环结束。把ab添加到list中

import java.util.ArrayList;

public class 子集 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        子集  zi=new 子集 ();
        int a[]={1,2,3,4};
        zi.search(a);
    }
    void search(int a[]){
        int len=1<<a.length;
    ArrayList<String> list=new ArrayList<String>();

        for(int i=0;i<len;i++){//len是2的n次方
            int j=i;
             String s="";
             int k=0;
            while(j>0){//j>0 k<a.length
                if((j&1)==1)
                    s+=a[k];
                k++;
                j=j>>1;
            }
            list.add(s);

        }
        for(String ss:list)
            System.out.println(ss );

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值