排列组合与集合的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
- 排列组合与集合的C语言实现相关
- C语言排列组合的实现
- C语言实现排列组合
- 排列组合 C语言实现
- c语言实现排列组合
- 回溯法 实现 排列组合(C 语言版本)
- c语言实现排列组合算法问题
- c语言实现排列组合算法问题
- c语言实现排列组合算法问题
- c语言实现排列组合算法问题
- {C语言算法}排列组合
- C语言排列组合
- C语言字符串与集合的关系
- 集合的排列组合
- C语言字符串相关方法的实现
- C语言实现二叉排序树的相关操作
- C语言实现单链表的相关解析
- 二叉树的建立与输出以及其他一些相关操作(递归算法实现) C语言
- git分支管理策略
- SSH网上商城--Struts2拦截器的应用
- bzoj2141排队
- 1071. Speech Patterns (25)PAT甲级
- GitHub概览
- 排列组合与集合的C语言实现相关
- JAVA环境搭建
- ac自动机背诵用模板
- 解决8080端口占用问题
- 代码块
- iOS小问题(二)
- firewalk ----- 主动网络探测工具
- 第17章 控件模版(3)——属性触发器
- 运算符和语句