c语言排列组合还可以这样求
本文主要讲编程比赛中常用的排列组合。
首先,排列组合的公式是(其中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语言排列组合还可以这样求相关推荐
- 汽车组装c语言排列组合算法,求一个关于排列组合的算法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include //0->o #include #include using namespace std; template ...
- c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...
想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...
- 【Python基础】Python中的高效迭代库itertools,排列组合随便求
本文目录 一.模块概述 二.组合生成器 2.1 product 2.2 permutations 2.3 combinations 2.4 combinations_with_replacement ...
- c语言字母数字有多少种组合,C语言------排列组合 组合情况(重复和不重复)
组合不重复数 问题引入: 1.不重复的情况: 例如ABCDE,让你从里面选出3个,问你一共有多少种可能,我们可以直接递归进行列举一共有多少种.下面看代码: #include intm,n;int f( ...
- C语言排列组合(函数
#include <stdio.h> #include <stdlib.h> //原型申明 int function(int,int); int main(int argc, ...
- 【概率论与数理统计】-排列组合笔试题汇总
位置排列问题 随机分配问题 像这种相同的物品分给多个人,这一类的问题 直接用隔板法,在物品队列插入隔板,分成多份. 最坏情况穷举问题 像这种问最多隔多少分钟或者取多少次能到达目的的题目,直接把最坏的结 ...
- c语言杨辉三角求排列组合,杨辉三角(Pascal Triangle)的几种C语言实现及其复杂度分析...
说明 本文给出杨辉三角的几种C语言实现,并简要分析典型方法的复杂度. 本文假定读者具备二项式定理.排列组合.求和等方面的数学知识. 一 基本概念 杨辉三角,又称贾宪三角.帕斯卡三角,是二项式系数在三 ...
- 合理抽象灵活运用排列组合(洛谷P2181题题解,Java语言描述)
题目要求 P2181题目链接 分析 其实,本题是一个数学题... 首先由题意得,不会有三条对角线交于一点,所以过某一个交点有且只能有2条对角线. 而这两条对角线实质上是确定了4个顶点(也可以看做是一个 ...
- Cmn递推函数c语言,Cmn排列组合 高三数学知识点总结归纳5篇精选
高三学生很快就会面临继续学业或事业的选择.面对重要的人生选择,是否考虑清楚了?这对于没有社会经验的学生来说,无疑是个困难的想选择.如何度过这重要又紧张的一年,我们可以从提高学习效率来着手!下面就是小编 ...
最新文章
- ZOJ 1423 (Your)((Term)((Project))) (模拟+数据结构)
- python数据处理实例-Python----数据预处理代码实例
- Python的gevent协程及协程概念
- 编程 态度目标_对目标持开放态度,从而推动事业发展
- beginnersbook 数据库教程
- 图片数据提取软件--GetData Graph Digitizer
- 取消计算机触摸板,笔记本电脑触摸板如何打开和关闭
- OBJ文件解析之OBJ的整体结构
- 鲁大师服务器cpu性能排行,鲁大师PC处理器性能排行:AMD撕裂者跑分碾压英特尔, i9 7980XE屈居第二!...
- 爬虫实现自动登陆抽屉网,实现对文章点赞,收藏,评论
- HDU2881 Jack's struggle (LIS)
- Android如何分析排查ANR
- 小学二年级计算机课游戏,小学二年级适合玩的课堂游戏
- 浅谈资金发展投资行业的发展路径
- NBUT 1119 Patchouli's Books (STL应用)
- 计算机主机和cpu的区别,主机与cpu的区别
- js删除数组里的某一项
- navicat怎么查看mysql版本_navicat怎么看版本
- GBK编码具体解析(附GBK码位分布图)
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
热门文章
- 35kV自动化系统在安徽怀远人民医院35kV配电工程的应用
- ES6 (十三)Set 和 Map 数据结构、WeakSet 和 WeakMap、WeakRef、FinalizationRegistry
- Mocha and Railgun
- Week 2 - Wed. Thu.
- Qt --- QTreeWidget 树形控件实例遇到的问题
- 编程好学吗?零基础能学编程吗?
- Python 如何添加新列_我用Python写了个股票分析工具,真香啊!
- oracle 数据字典画报,收藏!Oracle常用数据字典表、视图的总结,都在这里了
- 每日Scrum站会实践推荐
- VC++一文带你搞懂如何操作文件对话框(附源码)