编程练习:求包含N个整数的集合S的个数为M的子集(C语言实现)

思路:二维数组存,第一维存元素,第二维用0/1表示是否包含在子集中

※注意输出子集的格式,最后一给元素后面无逗号※

//包含N个整数的集合S,求S的所有元素个数为M的子集(0≤M≤N)
//例:N=4,S={1,2,3,4},若M=2,则输出结果为{1,2}{1,3}{1,4}{2,3}{2,4}{3,4}
//用二维数组表示,第一维存元素,第二维0/1表示是否包含在子集中
#include<stdio.h>
#include<math.h>
#define N 5 
#define M 3
int main() {
	int a[N][2]= {0},i,j,k,m,num,count; //count表示子集中元素的个数(1的个数)与M比较
	for(i=0; i<N; i++) {//第一维存元素
		scanf("%d",&a[i][0]);
	}
	num=pow(2,N);//子集个数
	for(j=0; j<num; j++) {
		for(k=0; k<N; k++) {
			a[k][1]=0;
		}
		m=j;
		i=0;
		count=0;//1的个数
		while(m!=0) {
			a[i][1]=m%2;
			if(a[i][1]==1) count++;
			m=m/2;
			i++;
		}
		if(count==M) {//子集元素个数符合条件的才输出
			printf("{");
			for(i=0; i<N; i++) {
				if(a[i][1]==1) {//注意输出的格式,最后一个元素后面无逗号 
					if(count>1) {
						printf("%d,",a[i][0]);
					} else {
						printf("%d",a[i][0]);
					}
					count--;
				}
			}
			printf("}");
		}
	}
	return 0;
}
发布了11 篇原创文章 · 获赞 11 · 访问量 4965

猜你喜欢

转载自blog.csdn.net/qq_37209590/article/details/104114163