您的位置:首页 > 其它

一个集合的所有子集

2014-09-14 16:32 239 查看

一个集合的所有子集:

(一)输出一个集合的所有子集:

(二)思想:

一个大小为n的集合,它的所有子集的个数为2^n,即一个n位的二进制数,其中每一个位可以为1,也可以为0,如果为1,表示对应位置的元素存在,否则不存在。

如:当i = 5时, j = i = 5,那么j = 0101; 我们对应的输出 a[0], a[2],

注意此中是将j的二进制形式,从右往左看,因为分离一个数的各位,往往都是先得到最右一位较为简单。

(三)实现:

时间复杂度为O(2^n),空间复杂度为O(n);

(1)整数数组形式:

#include <stdio.h>

int main()

{

        int a[4] = {1, 2, 3, 4};

        int length=sizeof(a)/(sizeof(a[0]));

        int i, j, k;

        int t = 1 << length;//一共有2^n个子集。

        for (i = 0; i < t; i++)

        //用n位的二进制数来表示对应的位是否存在。

        {

                j = i;

                k = 0;

                printf("{");

                while (j)

                {

                        if (j & 1)//取得j的二进制形式的最低位。

                        {

                                printf("%d", a[k]);

                        }

                        j >>= 1;//j右移一位

                        ++k;

                }

                printf("}\n");

        }

        return 0;

}

(2)字符串形式:

#include <stdio.h>

int main()

{

char a[5] = "ABCD";

int i, j, k;

int length=strlen(a);

int t = 1 << length;

for (i = 0; i < t; i++)

{

char b[5] = {0};

char * p = b;

j = i;

k = 0;

while (j)

{

if (j & 1)

*(p++) = a[k];

j >>= 1;

++k;

}

printf("%s\n", b);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法