题目描述
一个元素个数为n(n>0)的集合,有2n个子集(包括空集)。例如,集合A={a,b,c}的子集有23=8个,分别为:{}(空集)、{a}、{b}、{a、b}、{c}、{a,c},{b,c},{a,b,c}。
输入一集合(假设集合元素为字符),给出该集合的所有子集。子集的输出顺序根据样例输出分析得出。
输入
测试次数t
每组测试数据格式为:集合元素个数n,后跟集合的n个元素。
输出
对每组测试数据,输出子集个数,后面每行一个子集,输出所有子集。
输入样例
2
3
a b c
4
e f a d
输出样例
8
{}
{a}
{b}
{a,b}
{c}
{a,c}
{b,c}
{a,b,c}
16
{}
{e}
{f}
{e,f}
{a}
{e,a}
{f,a}
{e,f,a}
{d}
{e,d}
{f,d}
{e,f,d}
{a,d}
{e,a,d}
{f,a,d}
{e,f,a,d}
我的代码
# include<stdio.h>
# include<math.h>
# include<memory.h>
int main()
{
int t,n,i,count,j,m,k,q,p; //count是记录子集个数
scanf("%d",&t);
for(q=1;q<=t;q++)
{
count=0;
scanf("%d",&n);
getchar();
int a[n];
memset(a,0,n*sizeof(int));
char str[n];
for(i=0;i<n;i++)
{
scanf("%c",&str[i]);
getchar();
}
count=pow(2,n);
printf("%d\n",count);
printf("{}\n"); //第一个空集;
for(j=1;j<count;j++)
{
m=j;
k=0;
while(m!=0)
{
a[k]=m%2;
m=m/2;
k++;
}
printf("{");
for(i=0;i<n;i++)
{
if(a[i]==1)
{
printf("%c,",str[i]);
}
}
printf("\b}\n");
}
if(q!=t)
{
printf("\n");
}
}
}
本地运行结果
所以哪里错了 求解答!