回 帖 发 新 帖 刷新版面

主题:求任意给定集合输出全部子集的算法

[color=000080][/color][size=6][size=5][size=3]求集合的子集算法在网络有很多,有各种不同的算法,很难看懂,还有好多递归算法,本人写了一个算法,简单易懂,初学者很容易看懂,算法空间复杂度为O(n),时间复杂度为O(2的n次方)。利用一维数组实现,把集合中元素输入到A数组,另设一个数组B,和数组A一样大,i=1to n,A[i]=集合A中的元素,B[i]=0;
利用C语言函数中的整数除法和余数函数公式,可以实现。算法思想是利用整数转换二进制数,得数组B中元素从0000...0--111...1,变化了2的n次方,数组的B[i]元素为1对应输出于A[i]元素,B[i]中的元素为0不输出A[i]的元素 ,正好把数组A中的全部元素按子集输出
     [/size][/size][/size]   
[code=c]
#include<stdio.h>
#include<math.h>

void  main()

{
  int n;
  int b[8]={'a','b','c','d','e','f','g','h'};
    printf("input n\n");
      scanf("%d",&n);
        int x,y;
        int a[100];
        for( int i=0;i<n;i++)
            a[i]=0;
  for( int j=0;j<pow(2,n);j++)
{
    x=(int)pow(2,n)+j;
     for(int i=0;i<n;i++)

     {
      y=x%2;
      x=x/2;
      a[i]=y;

     if (a[i]==1) {printf("%c",b[i]);}
     }
   printf("\n" );
  }
  printf("空集\n");
}


[/code]

回复列表 (共4个回复)

沙发

for( int j=0;j<pow(2,n);j++)
{
    x=(int)pow(2,n)+j


以上两行为什么不是:
for(int j=1;j<=pow(2,n);j++)
{
    x=j;

板凳


[code=c]
for( int j=0;j<pow(2,n);j++)
{
    x=(int)pow(2,n)+j


以上两行为什么不是:
for(int j=1;j<=pow(2,n);j++)
{
    x=j;[/code]
第一行可以,但是X的初值是pow(2,n)而不是j,是因为取余数位数不够,所以要初值加pow(2,n),保证位数。你自己举一个例就知道了

3 楼

因为你有下面的循环
for(int i=0;i<n;i++)
不管x位数够不够,它能保证每个a[i]都能赋值,效果应该是一样的

4 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册