求大神解答 子集生成问题 (十分感谢)

#include<iostream>
#include<set>
using namespace std;
int ex(int n,int m)
{
    long pfs=n;
    long res=1;
    while(m!=0)
    {
        if((m&1)==1)
        res*=pfs;
        pfs*=pfs;
        m>>=1;
    }
    return res;
 } 
set<set<int> >getsub(int*a,int n)
{

    set<set<int> > res;
    for(int i=ex(2,n)-1;i>0;i--)
    {
        set<int>s;
        for(int j=n-1;j>=0;j--)
        {
         if(((i>>j)&1)==1)
         s.insert(a[j]);
        }
        res.insert(s);
    }
    return res; 
}
int main()
{
    int a[5]={1,2,3,4,5};
    set<set<int> > s;
    s=getsub(a,5);
    set<set<int> >::iterator it;
    for(it=s.begin();it!=s.end();it++)
    {
        cout <<*it<< " ";
    }
    cout<<endl;

}
#include<iostream>
#include<set>
using namespace std;
int ex(int n,int m)
{
    long pfs=n;
    long res=1;
    while(m!=0)
    {
        if((m&1)==1)
        res*=pfs;
        pfs*=pfs;
        m>>=1;
    }
    return res;
 } 
set<set<int>> getsub(int*a,int n)
{

    set<set<int>> res;
    for(int i=ex(2,n)-1;i>0;i--)
    {
        set<int>s;
        for(int j=n-1;j>=0;j--)
        {
         if(((i>>j)&1)==1)
         s.insert(a[j]);
        }
        res.insert(s);
    }
    return res; 
}
int main()
{
    int a[5]={1,2,3,4,5};
    set<set<int>> s;
    s=getsub(a,5);
    set<set<int>>::iterator it;
    for(it=s.begin();it!=s.end();it++)
    {
        set<int>::iterator it1;
        for (it1=it->begin(); it1 != it->end(); it1++)
            cout <<*it1<< " ";
        cout << endl;
    }
}

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 5
1 2 4
1 2 4 5
1 2 5
1 3
1 3 4
1 3 4 5
1 3 5
1 4
1 4 5
1 5
2
2 3
2 3 4
2 3 4 5
2 3 5
2 4
2 4 5
2 5
3
3 4
3 4 5
3 5
4
4 5
5