穷举子集合

问题描述:给定一个集合,列举出这个结合的所有非空子集合。

例如:{A,B,C},非空子集合为:{A}{B}{C}{AB}{AC}{BC}{ABC}

这里采用编码的算法,就是为每一位进行编码,0表示对应的元素不出现,1表示对应的元素出现。

那么ABC对应的编码为

0.    000            {}

1.    001            {C}

2.    010           {B}

3.    011           {BC}

4.    100           {A}

5.    101           {AC}

6.    110           {AB}

7.    111           {ABC}

这里提供两种方法,

       第一种方法fun1是自己手动将其对应的二进制位求出来,这种方法更加通用,推荐大家掌握这种方法。

       第二种方法fun2是利用Java自带的包,可以将指定的整数转换为二进制形式。

Java代码如下:

 1 public class Qjzjh {
 2     public static void fun1(String str){
 3         for(int i=1;i<Math.pow(2,str.length());i++)
 4         {       int a=i;
 5                 String ziji="";
 6              for(int j=str.length()-1;j>=0;j--)
 7                  {
 8                     if((a%2)!=0)ziji=str.charAt(j)+ziji;          //利用十进制转换为二进制的算法,求最后几位二进制
 9                     a=a/2;
10                  }
11              System.out.println(i+"  "+ziji);
12         }
13     }
14     
15     public static void fun2(String str){                        
16         for(int i=1;i<Math.pow(2,str.length());i++)
17         {   
18                 String ziji="";
19                 String binary=Integer.toBinaryString(i);         //借助Java自带的方法,将一个整数转换为2进制形式,转换后最高位为1
20                 for(int j=binary.length()-1;j>=0;j--)
21                  {
22                     if(binary.charAt(j)!='0')ziji=str.charAt(j+str.length()-binary.length())+ziji;
23                     
24                  }
25              System.out.println(i+"  "+ziji);
26         }
27     }
28     public static void main(String[] args) {
29         // TODO 自动生成的方法存根
30         String str="ABC";
31         fun1(str);
32         System.out.println();
33         fun2(str);
34     }
35 }
View Code

输出结果为:

1 C
2 B
3 BC
4 A
5 AC
6 AB
7 ABC

1 C
2 B
3 BC
4 A
5 AC
6 AB
7 ABC

转载于:https://www.cnblogs.com/guozhenqiang/p/5426227.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值