问题描述:给定一个集合,列举出这个结合的所有非空子集合。
例如:{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代码如下:
public class Qjzjh {
public static void fun1(String str){
for(int i=1;i<Math.pow(2,str.length());i++)
{ int a=i;
String ziji="";
for(int j=str.length()-1;j>=0;j--)
{
if((a%2)!=0)ziji=str.charAt(j)+ziji; //利用十进制转换为二进制的算法,求最后几位二进制
a=a/2;
}
System.out.println(i+" "+ziji);
}
}
public static void fun2(String str){
for(int i=1;i<Math.pow(2,str.length());i++)
{
String ziji="";
String binary=Integer.toBinaryString(i); //借助Java自带的方法,将一个整数转换为2进制形式,转换后最高位为1
for(int j=binary.length()-1;j>=0;j--)
{
if(binary.charAt(j)!='0')ziji=str.charAt(j+str.length()-binary.length())+ziji;
}
System.out.println(i+" "+ziji);
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
String str="ABC";
fun1(str);
System.out.println();
fun2(str);
}
}
输出结果为:
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