幂集的编写原理是利用最原始的二进制除法
a[0] a[1] a[2]
a b c
0 0 0 {} 0
0 0 1 {c} a[2] 1
0 1 0 {b} a[1] 2
0 1 1 {b c} a[1] a[2] 3
1 0 0 {a} a[0] 4
1 0 1 {a c} a[0] a[2] 5
1 1 0 {a b} a[0] a[1] 6
1 1 1 {a b c} a[0] a[1] a[2] 7
以下是思路 不能直接运行
x={0,1,2,3,4,5,6,7}
printf("{");
printf("{*},");//空集的情况
for(j=1;j<7;j++)//7为2的3次方 j从1开始是将空集的情况单独列出 这样是为了方便写循环语句
{y=j;
r=y%2;
m=y/2;
printf("{");
while(m)
{ma=3;//3为数组a的大小
if(r) printf("%d",a[ma-1]);
if(r&&(y/2)!=0) printf(",");//此句为格式控制的经典语句 认真体会
r=y%2;
m=y/2;
if(!m) printf(",");
ma--;
}
printf("}");
if(j<6) printf(",");//此句为格式控制的经典语句 认真体会
}
printf("}");
还要注意的地方就是输出格式的控制
具体代码见下:
#include"stdio.h"
#include<math.h>
#include<stdlib.h>
main()
{
int i,j,max,m,x,r,n,ma;
char c[10][20],ch;
scanf("%d",&max);
getchar();
for(i=0;i<max;i++)
{
scanf("%s",c[i]);
/* while((ch=getchar())!='/40')
{
c[i][j]=ch;
j++;
}
c[i][j]='/0';*/
}
printf("{ {*},");
n=pow(2,max);
for(j=1;j<n;j++)
{ ma=max;
m=j;
r=m%2;
printf("{");
while(m!=0)
{
if(r) printf("%s ",c[ma-1]);
if(r&&m&&((m/2)!=0)) printf(",");//或者写成if(r&&m&&((m/2)!=0)) printf(" ");这样的话元素之间的间隔就是空格
m=m/2;
r=m%2;
ma--;
}
printf("}");
if (j<n-1) printf(",");
}
printf("}/n");
getch();
}