排列组合与集合的C语言实现相关

来源:互联网 发布:时时彩网站源码 编辑:程序博客网 时间:2024/06/05 01:19

本文借鉴于《挑战程序设计竞赛》第二版P156到P157页的内容自己实现
1:枚举{0,1,~,n-1}所包含的所有子集的方法

#include <cstdio>#include <iostream>using namespace std;int used[10000];int main(){    int n;    cin >> n;    for(int i=0;i< 1 << n;i++){        memset(used,0,sizeof(used));        for(int j=0;j<n;j++) used[j] = i>>j & 1;        for(int j=0;j<n;j++) cout << used[j];        cout << endl;    }    return 0;}

输入n=6我们可以得到如下的结果

000000100000010000110000001000101000011000111000000100100100010100110100001100101100011100111100000010100010010010110010001010101010011010111010000110100110010110110110001110101110011110111110000001100001010001110001001001101001011001111001000101100101010101110101001101101101011101111101000011100011010011110011001011101011011011111011000111100111010111110111001111101111011111111111

2:枚举{0,1,~,n-1}所包含的所有大小为k的子集的方法即组合的实现

#include <cstdio>#include <iostream>using namespace std;int k=3;int used[10000];int main(){    int n;    cin >> n;    int comb=(1<<k) -1;    while(comb < 1 << n){        //***********************************        //这里针对comb进行处理        memset(used,0,sizeof(used));        for(int i=0;i<n;i++) used[i] = comb>>i & 1;        for(int i=0;i<n;i++) cout << used[i];        cout << endl;        //***********************************        int x = comb & -comb, y = comb + x;        comb = ((comb & ~y) / x >> 1) | y;    }    return 0;}

输入n=6我们可以得到如下的结果

111000110100101100011100110010101010011010100110010110001110110001101001011001100101010101001101100011010011001011000111

我们之后可以通过对used数组的操作来实现组合的效果

3:对集合{0,1,~,n-1}所有元素的全排列

#include <cstdio>#include <iostream>using namespace std;int main(){    int n,a[100000];    cin >> n;    for(int i=0;i<n;i++) a[i]=i;    do{        for(int i=0;i<n;i++) cout << a[i];        cout << endl;    }while(next_permutation(a,a+n));    return 0;}

输入n=4后得到

012301320213023103120321102310321203123013021320201320312103213023012310301230213102312032013210

4:枚举集合n(二进制表示)所包含的所有子集的方法

#include <cstdio>#include <iostream>using namespace std;int cal(int n){    int res=0;    while(n>0){        n/=10;        res++;    }    return res;}int main(){    int n,used[10000];;    cin >> n;    int len=cal(n);    int x=n;    do{        //***********************************************        //对子集的处理        memset(used,0,sizeof(used));        for(int i=0;i< (1 << len);i++) used[i] = x>>i & 1;        for(int i=0;i< (1 << len);i++) cout << used[i];        cout << endl;        //***********************************************        x=(x-1) & n;    }while(x != n);//处理完0后,会有-1&sup = sup;    return 0;}

我们输入182即01101101可以得到它所有的子集有这样的规律即原来位上是0则所有的子集这里也全是0,原来位上是1则子集里这里不一定是1

这里写代码片0110110100101101010011010000110101100101001001010100010100000101011010010010100101001001000010010110000100100001010000010000000101101100001011000100110000001100011001000010010001000100000001000110100000101000010010000000100001100000001000000100000000000000
0 0
原创粉丝点击