java求排列组合数 - Go语言中文社区

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

 

 

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_21808961/article/details/77990940
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-05-11 22:42:36
  • 阅读 ( 1195 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢