所谓幂集(Power Set), 就是原集合中所有的子集(包括全集和空集)构成的集族。
输入一个整数n(0<=n<=10)
输出由整数1~n构成的集合{1,2,3,...,n}的幂集。
输入格式:
整数n(0<=n<=10)
输出格式:
{1,2,3,...,n}的幂集,每行一个子集,子集不可重复,子集之间顺序以及子集元素之间顺序均不作要求。
子集输出格式:{x,x,x,..,x}(x表示子集中的元素)
输入样例1:
3
输出样例1:
{}
{1}
{2}
{3}
{1,2}
{1,3}
{2,3}
{1,2,3}
输入样例2:
0
输出样例2:
{}
#include <stdio.h>
void power_set(int *nums, int n) {
if (n == 0) { // 空集
printf("{}\n");
return;
}
int subset[n-1];
for (int i = 0; i < n-1; ++i) {
subset[i] = nums[i+1]; // 生成由1~n-1构成的幂集
}
power_set(subset, n-1);
int m = 1<<(n-1); // 由前面的幂集得到包含n的子集
for (int i = 0; i < m; ++i) {
printf("{%d", nums[0]);
for (int j = 0; j < n-1; ++j) {
if (i & (1<<j)) { // 判断第j位是否为1
printf(", %d", nums[j+1]); // 将其对应的元素输出
}
}
printf("}\n");
}
}
int main() {
int n;
scanf("%d",&n);
int nums[] = {1, 2, 3,4,5,6,7,8,9,10};
power_set(nums, n);
return 0;
}