问题描述:给定一个集合,列举出这个结合的所有非空子集合。
例如:{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 }
输出结果为:
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