求生成所有子集的算法
比如:{a, b, c}
子集是:
{a, b, c}
{a, b}
{a, c}
{a }
{b, c}
{b }
{c }
{ } //空集
问题点数:100、回复次数:5Top
1 楼gudfen(帝波微)回复于 2004-05-01 20:57:28 得分 25
#include <stdio.h>
#define MAX 10
void printPowerSet(int n, int post[], int num) {
if(n == 0) {
int i;
printf("{");
for(i = num-1; i >= 0; i--)
printf("%d ", post[i]);
printf("}\n");
return;
}
printPowerSet(n-1, post, num);
post[num] = n;
num++;
printPowerSet(n-1, post, num);
}
void main() {
int n, post[MAX];
printf("n=?(1-5)");
scanf("%d", &n);
printPowerSet(n, post, 0);
}
Top
2 楼theoldman(跛脚老人)回复于 2004-05-01 22:37:10 得分 25
// 非递归实现
#include "string.h"
#include "iostream.h"
void main()
{
char *str = "abcd" ;
cout << "the set is : {" << str <<"}"<< endl << endl ;
unsigned i,j,cover,count,display ;
unsigned length = strlen(str) ;
if(length>8*sizeof(display)) return ;
count = 1 << length ;
cout << "{}" << endl;
for(cover=display=i=1;i<count;i++)
{
cover = 1 ;
cout << "{" ;
for(j=0; j<length; j++)
{
if(display&cover)
{
cout << str[j] ;
}
cover = cover << 1 ;
}
cout << "}" ;
cout << endl ;
++display ;
}
}Top
3 楼mmmcd(超超)回复于 2004-05-01 22:57:53 得分 25
http://expert.csdn.net/Expert/topic/2902/2902133.xml?temp=.7710077Top
4 楼liem(阿明)回复于 2004-05-02 17:59:26 得分 24
如果一个集合的个数不多(比如<16),那么可以用一个子集对应一个整数来做。
以{a,b,c}为例,其子集{a,b}对应二进制110,{b,c}对应二进制011,因此只要做一个循环:
for(int i=0;i<8;i++)
将i分解成二进制数,再输出对应的元素就可以了。Top
5 楼WYlslrt(WY.lslrt(http://www.wyos.net))回复于 2004-05-04 11:08:25 得分 1
这么简单的问题要等我有键盘了再结帖!
我现在用鼠标点虚拟键盘,累死了!Top




