排列组合是我们高中时期就学过的知识,还记得当初被甲乙丙丁们站在一排的数学问题所折磨,苦不堪言呐。在实际编程过程中,我们也常遇到排列组合的问题。
那么,什么是排列组合呢?百度百科给的解释通俗易懂。排列组合是组合学最基本的概念,前后两者并不相同。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。例如3个男生和5个女生站成一排,3个男生必须相互紧邻,有多少种站法的问题,像下面这样。

在数学题中,我们通常只需要求出所有排列或者组合的总数即可,一两个公式就能算出来。但是,在实际应用中,有时须将排列组合的每一种情况都列出来,方便下一步的操作。稍微简单的问题,如在ABCD四个字母中选出两个来,不费吹灰之力便能列出。但是问题更复杂些呢,8个字母中选5个?16个字母中选7个?手动列出来就难多了吧。
如题目所示,这里我要介绍的是利用循环法实现排列组合,方法简洁、很易懂。言归正传,下面就开整。
示例:在0~7这8个整数中选出5个不重复的数,列出所有情况。先列出代码。

#include<opencv2/opencv.hpp>
#include<iostream>
#include<fstream>
#include<math.h>
#include<string>
#include<algorithm>
#include<time.h>
using namespace cv;
using namespace std;bool Equal_Judgement(vector<vector<int>> result, vector<int> temp);int main(int argc, char** argv){clock_t begin_t, end_t;  //定义开始和结束时间变量double duration;  //记录整个循环需要的时间vector<vector<int>> Permutation;  //定义向量容器,存储排列组合的所有情况vector<int> Array;  //定义向量容器,存储每一种情况里的元素begin_t = clock();  //获取当前时间int record = 0;for(int i = 0; i < 8; i++){ //一共8个整数for(int j = 0; j < 8; j++){if(j == i) continue;  //第二个数不能与第一个数重复for(int k = 0; k < 8; k++){ if(k == i || k == j) continue;   //第三个数不能和前两个数重复for(int l = 0; l < 8; l++){if(l == i || l == j || l == k) continue;  //第四个数不能和前三个数重复for(int m = 0; m < 8; m++){if(m == i || m == j || m == k || m == l) continue;  //以此类推Array.clear();  //容器清空Array.push_back(i);  //往容器中添加元素Array.push_back(j);Array.push_back(k);Array.push_back(l);Array.push_back(m);sort(Array.begin(),Array.end());  //容器中元素从小到大排序if(Permutation.size() < 1) Permutation.push_back(Array);else{bool Judg_Value1;//判断当前Array是否与前面的重复Judg_Value1 = Equal_Judgement(Permutation, Array);  if(Judg_Value1 == true) {Permutation.push_back(Array);record++;printf("第%d个组合是%d %d %d %d %d\n",record,i,j,k,l,m);}}}}}}} end_t = clock();duration = (double)(end_t - begin_t) / CLOCKS_PER_SEC;  //计算经过时间printf( "%f seconds\n", duration );  printf("总共有%d种情况\n", Permutation.size());waitKey(0);return 0;
}
bool Equal_Judgement(vector<vector<int>> result, vector<int> temp){int length;length = result.size();sort(temp.begin(), temp.end());for(int i = 0; i < length; i++){  //判断是否有重复的整型数组if(temp == result[i]){return false;break;}}return true;
}

基本思路:我们定义了两个向量容器,分别命名为Array和Permutation。Array用于存放整数,表示一种组合情况;Permutation用于存放前一个容器Array,表示所有的组合情况。利用5层循环将选择的5个数列出来,再通过函数Equal_Judgement()来判断这种情况是否与之前的组合情况重复,如果没有,则保存起来;重复则舍弃掉。结果如下(组合数从0计)。

这样,我们就实现了从8个数中选5个不重复数的所有组合情况。
在别人的博客中我学习到一种非常巧妙的方法,递归。利用排列组合具有的递归性质进行求解,感兴趣的可以去看这篇博客:https://blog.csdn.net/u012814856/article/details/73863086。出于好胜心,我将自己的方法与前面的递归法比较了一下,让我惊喜的是,循环法貌似计算速度还更快些。大家感兴趣的可以自己去试试。
欢迎点赞评论留言,分享你独特的见解。

C语言利用循环方法实现排列组合相关推荐

  1. C语言打印字符串的所有排列组合(附完整源码)

    C语言打印字符串的所有排列组合 字符串的所有排列问题 C语言打印字符串的所有排列组合的完整源码(定义,实现,main函数测试) 字符串的所有排列问题 示例:ABC的排列是ABC,ACB,BCA,BAC ...

  2. R语言使用choose函数计算排列组合:组合数(输入两个参数、combination)

    R语言使用choose函数计算排列组合:组合数(输入两个参数.combination) 目录 R语言使用choose函数计算组合数(输入两个参数.combination) R 语言特点 R语言使用ch ...

  3. c语言杨辉三角求排列组合,杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析...

    说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一  基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三 ...

  4. 语言 全排列 函数_【排列组合】错位全排列的简化计算公式

    一.错位全排列问题 什么是错位全排列问题?其实很简单,在生活中可能都会遇到: "装错信封问题"是由当时最有名的数学家约翰·伯努利(Johann Bernoulli,1667-174 ...

  5. 三个字母排列组合c语言,n个球的排列组合算法

    /*算法说明: 问题:现在有n个球,分别编号为1,2,3···n,对这n个球有多少种不重复的排列,列出所有的排列. 解:由数学知识可知:第一个球有n种选择,第二个球有n-1个选择··所以共有n!种选择 ...

  6. C语言山行组合数,高中排列组合基础题-(含答案).doc

    排列.组合问题基本题型及解法 同学们在学习排列.组合的过程中,总觉得抽象,解法灵活,不容易掌握.然而排列.组合问题又是历年高考必考的题目.本文将总结常见的类型及相应的解法. 一.相邻问题"捆 ...

  7. 阶乘公式c语言程序,c阶乘公式(排列组合与阶乘)

    C的计算:下标的数字乘以上标的数字的个数,且每个数字都要-1.再除以上标的阶乘.如:C5 3(下标是5,上标是3)=(5X4X3)/3X2X1. 3X2X1(也就是3的阶乘) A. 公式:n!=n*( ...

  8. c语言利用循环结构解决密码转换,C语言课件第六章循环结构.ppt

    C语言课件第六章循环结构 第6章 循环结构程序设计 6.1循环结构的组成 循环结构:描述有规律的重复操作问题. 组成:要重复执行的操作,重复执行所需的条件. 例6.1:求10! . 分析:计算1*2* ...

  9. C语言利用循环判断大月小月,对大月和小月进行判断

    var BirYear,BirMonth,BirDay; function Ymd() { BirYear=parseInt(prompt("请输入您的出生年份")); BirMo ...

最新文章

  1. 李沐:用随机梯度下降来优化人生!
  2. 线性回归api深度介绍
  3. iOS学习之Runtime(二)
  4. WxMac BadgeLabels
  5. 鼠标右键 移动选定的文件夹到指定位置_怎么把电脑桌面上的文件移动到更加安全的地方...
  6. 拥抱 Elasticsearch:给 TiDB 插上全文检索的翅膀
  7. Mac上有什么实用的必备软件?
  8. js a/a中this的使用
  9. 苹果mac视觉效果和动态图形设计软件:After Effects 2022 (ae 2022)
  10. linux kernel directory
  11. GBK编码和UTF-8编码区别各所占用字节数
  12. 基于matlab的最小二乘法曲线拟合实现,最小二乘法曲线拟合MATLAB实现
  13. Java接入第三方微博登陆
  14. kangle配置cdn_kangle穿刺及cdn回源配置
  15. html chm用浏览器打开方式,访问chm文件出现 已取消到该网页的导航的解决方法
  16. Windows中获取用户密码
  17. 企业如何推动组织变革?
  18. 微信小程序怎么添加底部菜单按钮
  19. 启锐 588 打印机每次打印都流出一部分,没有重新切换纸张
  20. 使用哈尔滨工业大学SCIR的开源代码训练自己的ELMo

热门文章

  1. 淘宝怎么查询商品历史价格信息?item_history_price-获取商品历史价格信息
  2. 15款免费又好用的安全软件
  3. H5页面唤起手机数字键盘
  4. 中国移动IMS手机客户端初体验
  5. BT下载方式改为uTorrent下载、BS上传
  6. 博士申请 | 美国圣路易斯华盛顿大学王晨光老师招收NLP方向全奖博士/博后/硕士...
  7. 【区块链】以太坊交易中的R、S、V字段
  8. C/C++里面使用loadimage导入图片和使用miSendString播放音乐函数运行不显示图片不播放音乐的解决问题
  9. 地势坤,君子以厚德载物
  10. 招聘要求之一:是个好人