C++-二進制法枚舉子集

#include<cstdio>
#include<iostream>
using namespace std;
void print_subset(int n,int s){
	for(int i=0;i<n;i++){
		if(s&(1<<i)) cout<<i;
 	}
 	if(s!=0)//第一次循環不需要換行 
 	cout<<endl;
}
int main(){
	int n=5;//n爲集合元素個數  編號從0開始 爲0,1,2……n-1 
    for(int i=0;i<(1<<n);i++)//主算法 
	print_subset(n,i);
	system("pause");	
	return 0;
} 
可加入NumberOf1函數 使輸出的子集個數爲定值
#include<cstdio>
#include<iostream>
using namespace std;
int NumberOf1(int n){//返回二進制一的個數 注意類型 
	int count=0;
	unsigned int flag=1;//flag從1開始 每次循環左移一位 與n做&運算 判斷該位是否爲1 
	while(flag<=n){  //flag大於n 退出循環 
		if(n&flag)
		count++;
		flag=flag<<1; 
	}
	return count;
}
void print_subset(int n,int s){
	if(NumberOf1(s)==3){//每個子集的個數爲3
	for(int i=0;i<n;i++)
		if(s&(1<<i)) cout<<i;
 	
 	if(s!=0)//第一次循環不需要換行 
 	cout<<endl;
	}
}
int main(){
	int n=5;//n爲集合元素個數  編號從0開始 爲0,1,2……n-1 
    for(int i=0;i<(1<<n);i++)//主算法 
	print_subset(n,i);
	system("pause");	
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章