主题:求任意给定集合输出全部子集的算法
[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]
利用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]