C++-二进制法枚举子集

xiaoxiao2021-02-28  51

#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; }
转载请注明原文地址: https://www.6miu.com/read-2626283.html

最新回复(0)