对输入的任意正整数,打印出集合{0,1,…,n-1}的所有子集 例如输入3 输出{}、{0}, {1},{0,1},{2},{0,2},{1,2}, {0,1,2}
吉林大学计算机考研高级语言程序设计
这个采用二进制枚举法,为了方便找对应的位数,这里从前往后增加二进制数
下面以3为例,列出了对应关系
二进制数 | 对应的数 |
---|---|
000 | 无 |
100 | 0 |
010 | 1 |
110 | 0,1 |
001 | 2 |
101 | 0,2 |
011 | 1,2 |
111 | 0,1,2 |
下面是代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*算法思想:利用二进制来枚举所有的情况.
例如:000什么也不输出,100输出0,010输出1,110输出0和1*/
//toAdd函数作用是二进制加一操作,不过为了方便判断第几位,采用从前往后增加
//即:000,100,010,110,001,101,011,111
void toAdd(int a[],int n)
{
int k=0;
//遇见1就置零
while(a[k]==1)
{
a[k]=0;
k++;
}
//第一个为0的那一位置1然后退出
a[k]=1;
}
int main()
{
int n;
scanf("%d",&n);
//数组a用来存储二进制
int a[n];
for(int i=0;i<n;i++)
{
a[i]=0;
}
//求2的n次方
int t=pow(2,n);
int flag;
//由二进制的枚举方法知道要有2的n次方个情况需要输出
for(int i=0;i<t;i++)
{
flag=1;
printf("{");
for(int j=0;j<n;j++)
{
if(a[j]==1)
{
//第一个输出的数前边没有逗号,单独处理
if(flag)
{
flag=0;
printf("%d",j);
}
else
{
printf(",%d",j);
}
}
}
printf("}\n");
//二进制数加一然后继续判断
toAdd(a,n);
}
return 0;
}