本文主要讲编程比赛中常用的排列组合。

首先,排列组合的公式是(其中P代表的就是A)

最普通的算法就是按照公式求了,即分子算出来,分母算出来,然后相除,写成代码为:

int c( int m,int n )
{int a = 1,b = 1, c = 1;for( int  i = 1 ; i <= m ; i++ )a = a*i;for( int i = 1 ; i <= n  ; i++  )b = b*i;for( int i = 1 ; i <= m-n ; i++  )c = c*i;return a/(b*c);
}

很显然,这种方法不好,很容易溢出,只要数据范围一大,就不能行了。

实际上,我们自己在纸上算排列组合的时候也并不是按照公式老老实实的算,其实可以化简,即约分。

比如c(5,4)按照原来的方法=A(5,4)/!4,其实c(5,4)=c(5,1)= 5/1  = 1;

那么就是c(m,n)= m*(m-1)*.......(m-n+1) / ! n  。

写成代码为:

int c( int m,int n )
{int a = 1,b = 1;n = min(n,m-n);             //求简单一点的  例如C(5,4) 可以求C(5,1)if( n == 0 )return 1;for( int i = m ; i >=m-n+1 ; i--  )a = a*i;for( int i = 1 ; i <= n ; i++ )b = b*i;return a/b;
}

这个方法相对于上一个好一点,但是还是有问题,数据太大会溢出,而且不能进行取模运算(反正我不知道)。

那么,再介绍一种方法,递推的思想,

其实排列组合还是挺有规律的,例如下面的

(1,1)  (1,2)  (1,3)  (1,4)  (1,5)  (1,6)

   1       2       3       4       5       6

         (2,2)  (2,3)  (2,4)  (2,5)  (2,6)

            1       3       6       10     15

                   (3,3)  (3,4)  (3,5)  (3,6)

                     1       4       10     20

                            (4,4)  (4,5)  (4,6)

                              1       5       15

                                      (5,5)  (5,6)

                                       1       6

                                               (6,6)

                                                1

因为具有对称性,我只列了一半,高中书本里介绍过杨辉三角,其实很简单,就是c(n,m)=c(n,m-1)+c(n-1,m-1),对应到上幅图中就是:某一个 等于 这个的左边的 加上 这个左边的上边的。即C(2,3) = C(2,2)+C(1,2)

那么我们先把第一层算出来,然后递推第二层,然后递推。这种方法的优点是一次就把所有的求出来了,而且中间可以进行取模运算。

我们用一个二维数组来存储结果。

代码如下:

int a[1001][1001];                    //数组的大小随实际情况而定//数组的类型最好为     long long
void c(  )
{memset(a,0,sizeof(a));for( int i = 1 ; i <= 1000 ; i++ )        //对第一层初始化 , 范围视情况而定a[1][i] = i,a[0][i] = 1;for( int r = 2 ; r <= 1000 ; r++ )          //枚举行for( int c = r ; c <= 1000 ; c++ )  //枚举列{a[r][c] = a[r][c-1]+a[r-1][c-1];/*if( a[r][c] > mo )a[r][c] = a[r][c] % mo;         取模运算一般题目都会给一个mo,让你取模*/}
}

本文只讲了C(m,n),没有讲A(m,n),实在是能力有限,以后学到相关知识一定补充!

最后给自己打个广告吧,自己做了一个网站,大家可以访问访问

https://www.bowenyang666.com

c语言排列组合还可以这样求相关推荐

  1. 汽车组装c语言排列组合算法,求一个关于排列组合的算法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include  //0->o #include #include using namespace std; template ...

  2. c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...

    想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...

  3. 【Python基础】Python中的高效迭代库itertools,排列组合随便求

    本文目录 一.模块概述 二.组合生成器 2.1 product 2.2 permutations 2.3 combinations 2.4 combinations_with_replacement ...

  4. c语言字母数字有多少种组合,C语言------排列组合 组合情况(重复和不重复)

    组合不重复数 问题引入: 1.不重复的情况: 例如ABCDE,让你从里面选出3个,问你一共有多少种可能,我们可以直接递归进行列举一共有多少种.下面看代码: #include intm,n;int f( ...

  5. C语言排列组合(函数

    #include <stdio.h> #include <stdlib.h> //原型申明 int function(int,int); int main(int argc, ...

  6. 【概率论与数理统计】-排列组合笔试题汇总

    位置排列问题 随机分配问题 像这种相同的物品分给多个人,这一类的问题 直接用隔板法,在物品队列插入隔板,分成多份. 最坏情况穷举问题 像这种问最多隔多少分钟或者取多少次能到达目的的题目,直接把最坏的结 ...

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

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

  8. 合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)

    题目要求 P2181题目链接 分析 其实,本题是一个数学题... 首先由题意得,不会有三条对角线交于一点,所以过某一个交点有且只能有2条对角线. 而这两条对角线实质上是确定了4个顶点(也可以看做是一个 ...

  9. Cmn递推函数c语言,Cmn排列组合 高三数学知识点总结归纳5篇精选

    高三学生很快就会面临继续学业或事业的选择.面对重要的人生选择,是否考虑清楚了?这对于没有社会经验的学生来说,无疑是个困难的想选择.如何度过这重要又紧张的一年,我们可以从提高学习效率来着手!下面就是小编 ...

最新文章

  1. ZOJ 1423 (Your)((Term)((Project))) (模拟+数据结构)
  2. python数据处理实例-Python----数据预处理代码实例
  3. Python的gevent协程及协程概念
  4. 编程 态度目标_对目标持开放态度,从而推动事业发展
  5. beginnersbook 数据库教程
  6. 图片数据提取软件--GetData Graph Digitizer
  7. 取消计算机触摸板,笔记本电脑触摸板如何打开和关闭
  8. OBJ文件解析之OBJ的整体结构
  9. 鲁大师服务器cpu性能排行,鲁大师PC处理器性能排行:AMD撕裂者跑分碾压英特尔, i9 7980XE屈居第二!...
  10. 爬虫实现自动登陆抽屉网,实现对文章点赞,收藏,评论
  11. HDU2881 Jack's struggle (LIS)
  12. Android如何分析排查ANR
  13. 小学二年级计算机课游戏,小学二年级适合玩的课堂游戏
  14. 浅谈资金发展投资行业的发展路径
  15. NBUT 1119 Patchouli's Books (STL应用)
  16. 计算机主机和cpu的区别,主机与cpu的区别
  17. js删除数组里的某一项
  18. navicat怎么查看mysql版本_navicat怎么看版本
  19. GBK编码具体解析(附GBK码位分布图)
  20. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

热门文章

  1. 35kV自动化系统在安徽怀远人民医院35kV配电工程的应用
  2. ES6 (十三)Set 和 Map 数据结构、WeakSet 和 WeakMap、WeakRef、FinalizationRegistry
  3. Mocha and Railgun
  4. Week 2 - Wed. Thu.
  5. Qt --- QTreeWidget 树形控件实例遇到的问题
  6. 编程好学吗?零基础能学编程吗?
  7. Python 如何添加新列_我用Python写了个股票分析工具,真香啊!
  8. oracle 数据字典画报,收藏!Oracle常用数据字典表、视图的总结,都在这里了
  9. 每日Scrum站会实践推荐
  10. VC++一文带你搞懂如何操作文件对话框(附源码)