数组全组合的问题,难住我好几天了。
请教个问题。
有个数组{a,b,c,d},要求输出数组中元素的全组合,不包括重复出现的元素,也就是要这个效果:{a} ..{d},{a,b},{a,c},{a,d}..{c,d},{a,b,c}..{b,c,d},{a,b,c,d}。不要用穷举法。
由于本人算法比较差,所以大家帮忙啊。
[解决办法]
可转换为二进制处理.
[解决办法]
坏了,丢脸了,上面的错了,改一下。
char* str = "abc";
for (int i = strlen(str); i > 0; i--)
printzj(str, i);
void printzj(char* str,int num)
{
int i;
if (num == 1)
printf("%c\n",str[num - 1]);
else {
for (i = 0; i < num; i++)
printf("%c ",str[num - 1]);
printzj(str, num - 1);
}
}
[解决办法]
数组{a,b,c,d}的长度为4。
则可以用,数位长度为4的二进制数表示,这个数组的所有,子集。
a—0001,b—0010,c—0100,d—1000.
ac—0101,bc—0110,bcd—1110,abcd—1111.
而这些二进制所表示的十进制数,即为1至(2^n)-1。(n为数组长度4)
public class test {
private static final char s[]={'a','b','c','d'};
public static void main (String args[]) {
for (int i = 1; i < Math.pow (2,s.length); i++) {
f (i,0);
System.out.println ("");
}
}
public static void f (int a,int b) {
if (b==3) {
if (a==1) System.out.print ( s[b] );
} else {
int c=a>>1;
if ( a-c*2==1 ) System.out.print ( s[b] );
f (c,b+1);
}
}
}
只可惜,这样排序打印出来的结果不怎么好看。
[解决办法]
集合有多少个元素,就相应地取一个位数与元素个数相同的二进制数。
如{a,b,c,d}对应一个四位的二进制数。
1010 表示 {a,c}
1100 表示 {a,b}
即相应位出现1,表示取该元素入子集
否则,不取~!