java求排列组合数

排列数公式

A^m_n=A(n,m)=n(n-1)(n-2)\cdot(n-m+1)=\dfrac{n!}{(n-m)!}
组合数公式

C^m_n=C(n,m)=\dfrac{A^m_n}{A^m_m}=\dfrac{A(n,m)}{A(m,m)}\\ =\dfrac{n(n-1)(n-2)\cdots(n-m+1)}{m!}=\dfrac{n!}{m!(n-m)!}

组合数性质

即从m个不同元素中取出n个元素的组合数=从m个不同元素中取出(m-n)个元素的组合数;即:C_n^m=C_n^{n-m}运用互补性质可以简化组合数的计算量。

package com.lan.MathFunction;
//求排列数组合数
public class Test
{
	// 求排列数 A(n,m) n>m
	public static int A(int n, int m)
	{
		int result = 1;
		// 循环m次,如A(6,2)需要循环2次,6*5
		for (int i = m; i > 0; i--)
		{
			result *= n;
			n--;// 下一次减一
		}
		return result;
	}
	// 求组合数,这个也不需要了。定义式,不使用互补率
	public static int C2(int n, int m)
	{
		// int denominator=factorial(up);//分母up的阶乘
		// 分母
		int denominator = A(m, m);// A(6,6)就是求6*5*4*3*2*1,也就是求6的阶乘
		// 分子
		int numerator = A(n, m);// 分子的排列数
		return numerator / denominator;
	}
	public static int C(int n, int m)// 应用组合数的互补率简化计算量
	{
		int helf = n / 2;
		if (m > helf)
		{
			System.out.print(m + "---->");
			m = n - m;
			System.out.print(m + "\n");
		}
		// 分子的排列数
		int numerator = A(n, m);
		// 分母的排列数
		int denominator = A(m, m);
		return numerator / denominator;
	}
	public static void main(String[] args)
	{
		for (int i = 1; i <= 6; i++)
		{
			System.out.println("A(6," + i + ")=" + A(6, i));
		}
		for (int i = 1; i <= 6; i++)
		{
			System.out.println("C(6," + i + ")=" + C(6, i));
		}
		System.out.println("C(6,5)=" + C(6, 5));// 6
	}
}

结果:

A(6,1)=6
A(6,2)=30
A(6,3)=120
A(6,4)=360
A(6,5)=720
A(6,6)=720
C(6,1)=6
C(6,2)=15
C(6,3)=20
4---->2
C(6,4)=15
5---->1
C(6,5)=6
6---->0
C(6,6)=1
5---->1
C(6,5)=6

 参考文档

https://wenku.baidu.com/view/39f79decb04e852458fb770bf78a6529647d350f.html

 

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值