3.5 🐭子集生成\n编写一个方法,返回某集合的所有非空子集\n给定一个int数组A和数组的大小int n,请返回A的所有非空子集\n保证A的元素个数小于等于20,且元素互异用c实现
时间: 2024-12-16 19:16:40 浏览: 10
在C语言中,你可以使用递归的方式来生成一个整数数组的所有非空子集。下面是一个简单的函数实现,它采用了分治的思想:
```c
#include <stdio.h>
#include <stdbool.h>
// 功能:返回一个布尔数组表示的子集
bool* subset(int A[], int n, bool result[], int index) {
if (index == n) { // 当遍历到数组末尾,添加一个全为0的子集
result[index] = true;
return result + 1; // 返回包含当前结果的新数组地址
}
// 两种情况:当前元素加入子集或不加入
result[index] = true; // 加入当前元素
subset(A, n, result, index + 1); // 调用自身,处理下一个元素
result[index] = false; // 不加入当前元素
subset(A, n, result, index + 1); // 继续处理其他元素
return result; // 结束递归后返回结果数组
}
// 主函数,用于生成并打印所有非空子集
void generate_subsets(int A[], int n) {
bool *subsets = subset(A, n, NULL, 0);
int num_subsets = 1 << n; // 计算子集总数,二进制右移n位
for (int i = 0; i < num_subsets; ++i) {
printf("[ ");
for (int j = 0; j < n; ++j) {
if (subsets[i]) {
printf("%d ", A[j]);
}
}
printf("]\n");
}
free(subsets); // 释放内存
}
int main() {
int A[] = {1, 2, 3}; // 示例数组
int n = sizeof(A) / sizeof(A[0]);
generate_subsets(A, n);
return 0;
}
```
这个程序首先计算出所有可能的子集数量,然后通过递归调用`subset()`函数生成每一个子集,并将结果存储在一个布尔数组中。注意,这里使用了二进制来简化子集计数过程。
阅读全文