码迷,mamicode.com
首页 > 其他好文 > 详细

子集生成方法

时间:2018-02-25 00:11:54      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:cout   判断   return   source   cstring   方法   class   char   解决   

问题

输出n个元素的所有子集,如{a,b,c}的子集为{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}

解决

方法1

如果这些子集用0/1表示的话,可表示为000,001,010,100,110,101,011,111,其中1表示这个元素属于这个子集,0表示不属于。

这种0/1表示法让我想到了数据在内存中的存放也是0/1,所以下面用这种思路解决这个问题。

#include <iostream>
#include <cstring>
using namespace std;
void SubsetGeneration(const char *s)
{
    unsigned long long n = 1;
    int len = strlen(s);
    for(int i = 0;i < len;++i)
        n *= 2;
    --n;//n个1组成的数等于 2^n-1
    for(unsigned long long i = 0;i <= n;++i)
    {
        unsigned long long temp = i;
        cout << i+1 << ‘:‘;
        for(int j = 0;j < len;++j)
        {
            if(temp & 1)//判断s中最前位为1还是0
                cout << s[j];
            temp  >>= 1;//将s往后移动1位
        }
        cout << endl;
    }
}
int main()
{
    char a[sizeof(long long)+1];
    while(cin >> a)
    {
        SubsetGeneration(a);
    }
    return 0;
}

撇开运算效率的问题,这种做法无法解决元素数大于sizeof(long long)

子集生成方法

标签:cout   判断   return   source   cstring   方法   class   char   解决   

原文地址:https://www.cnblogs.com/h-hg/p/8467906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!