void allaggr(int* a, int n) {
int end;
end = (1 << n) - 1;// 0 ~(2^n - 1) 号集合
for (int i = 0; i <= end; i++) {
printf(" {");
for (int m = 0; m < n; m++) {
if ( (i>>m)& 1) {//右移m位,并取最后一位,为1则输出第m位对应的值
printf("%3d", a[m]);
}
}
printf("} ");
}
}
int main() {
int a[10], n = 0;
char x;
while (~scanf("%c",&x)&&x!='\n'&&n<10) {
a[n++] = x-48;
}
allaggr(a, n);
}
输入:一串不同数字(0~9);如:1345
输出: {} { 1} { 3} { 1 3} { 4} { 1 4} { 3 4} { 1 3 4} { 5} { 1 5} { 3 5} { 1 3 5} { 4 5} { 1 4 5} { 3 4 5} { 1 3 4 5};
原理:集合内的数个数为n,则{0……0~1……1}各位置与集合各位置对应,为1则输出该位置,为0则不输出。