编写递归函数,求n个元素集合的所有子集。不妨令集合元素为小写字母,原集合为{‘a’, ‘b’, …, ‘a’ + n - 1}。
输入:input.txt,仅包含整数n(1-26)。
输出:若输入合法,输出集合的所有子集;否则输出“WRONG”。子集输出格式为每行一个子集,空集用空行表示,非空集合每个元素间用一个空格间隔,最后一个元素之后不能有空格。例如,对n=3,可能的输出为:
―――――――――――
a
a b
a b c
a c
b
b c
c
――――――――――――-
代码如下
#include<iostream>
#include<cmath>
using namespace std;
// 判断某个字母是否在此子集内
void printSet(char*characters, int n, int a[],int i,int j) {
if (j > n - 1)return;
else {
if (i & a[j] && j != n - 1) cout << characters[j] << " ";
if (j==n-1&&i&a[n - 1]) cout << characters[n - 1];
}
printSet(characters, n, a, i, j + 1);
}
// 一个集合一个集合的判定子集元素并输出
void SubSet(char*characters, int n,int a[]) {
for (int i = 0; i < pow(2, n); i++) {
printSet(characters, n, a, i, 0);
cout << endl;
}
}
int main(){
char characters[26];
int a[26];
characters[0] = 'a';
a[0] = 1;
// 初始化字母
for (int i = 1; i < 26; i++)
{
characters[i] = 'a' + i;
a[i] =a[0]<<i;
}
int n;
cin >> n;
if (n<1||n > 26)cout << "WRONG";
else
SubSet(characters, n,a);
return 0;
}