1. 程式人生 > 其它 >二進位制列舉模版

二進位制列舉模版

模擬寫法

列舉子集

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	int b[100];
	cin>>n;
	for(int i=0; i<=n; i++)b[i]=0;
	while(b[0]==0){
		for(int i=1; i<=n; i++)cout<<b[i];
		cout<<"\n";
		int j=n;
		while(b[j]==1)
			j--;
		b[j]++; 
		for(int i=j+1; i<=n; i++)b[i]=0; 
	} 

	return 0;
}

組合輸出

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int n, r;
	int b[100];
	cin>>n>>r;
	for(int i=1; i<=n; i++)b[i]=i;
	b[0]=-1;
	while(b[0]==-1){
		for(int i=1; i<=r; i++)cout<<b[i]<<" ";
		cout<<"\n";
		int j=r; 
		while(b[j]==n-r+j)j--;
		b[j]++;
		for(int i=j+1; i<=r; i++)b[i]=b[i-1]+1;
	} 

	return 0;
}

位運算寫法

列舉子集

#include<bits/stdc++.h>
using namespace std;
int a[10];
void print_subset(int n)
{
    for(int i=0; i<(1<<n); i++){
        for(int j=0; j<n; j++)
            if(i&(1<<j))
                cout<<a[j]<<" ";
        cout<<endl;
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<n; i++)a[i]=i+1;//初始化陣列
    print_subset(n);
    return 0;
 }

組合輸出

#include<bits/stdc++.h>
using namespace std;
int a[10];
void print_subset(int n, int m)
{
    for(int i=0; i<(1<<n); i++){
        int num=0, kk=i;//num統計i中1的個數;kk用來處理i
        while(kk){
            kk=kk&(kk-1);//清除kk中的最後一個1
            num++;//統計1的個數
        }
        if(num==m){//二進位制數中的1有k個,符合條件
            for(int j=0; j<n; j++)
                if(i&(1<<j))
                    cout<<a[j]<<" ";
            cout<<endl;
        }
    }
}
int main()
{
    int n, m;
    cin>>n>>m;
    for(int i=0; i<n; i++)a[i]=i+1;//初始化陣列
    print_subset(n, m);
    return 0;
 }