用递归的思想计算出集合的子集:
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
#define MAXSIZE 100
int sub_set(vector<string> &n,int *m,int size)
{
string new_string = "";
stringstream ss; // 将 int 类型 转换为 string 类型
if(size == 1)
{
ss << m[0];
new_string = ss.str();
ss.str(""); // 清空 stringstream 内的缓存
n.push_back(new_string); // 装载进容器中
return 0;
}
sub_set(n,m,size-1);
auto vec_size = n.size(); // 下一层循环结束以后 直接从此处开始执行
// 依次从容器中取出元素 和 当前层次的元素结合 从而得出新的子集元素
for(decltype(vec_size) i = 0; i < vec_size; i++)
{
ss << m[size-1];
new_string = n[i] + "," + ss.str();
ss.str("");
n.push_back(new_string);
}
ss << m[size-1];
new_string = ss.str();
ss.str("");
n.push_back( new_string );
return 0;
}
bool cmp( const string &a,const string &b ) // 排序的规则
{
if(a.size() < b.size() )
{
return true;
}
else
{
return false;
}
}
int main()
{
int n = 0;
int arry[MAXSIZE];
vector<string> subset;
cin >> n;
for(int i = 0; i < n;i++)
{
arry[i] = i+1;
}
sub_set(subset,arry,n);
sort(subset.begin(),subset.end(),cmp); // 排序 ,结果看起来更方便
cout<< "子集为:"<<endl;
vector<string>::const_iterator iter = subset.begin();
for( ; iter != subset.end() ; iter++ )
{
cout<<*iter<<endl;
}
cout << "Null" << endl; // 用以表示空集
<span style="font-family: Arial, Helvetica, sans-serif;"> return 0;</span>
}