栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

组合数个数的代码实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

组合数个数的代码实现

组合数公式

代码实现 明确数据类型

首先要先明确运算的数据类型。排列组合数是一组数字总共有多少种排列组合,所以运算的结果一定是整数。
记C(m, n)为从n个数中选取m个数,这些数无序有多少种不同的选法
记A(m, n)为从n个数中选取m个数,且这些数是有序的有多少种不同的选法

求解方法1:先求出分子分母如何做除法
public class Main {
    public static int arrayNumber(int m, int n){
        if (m == 0) return 1;
        int sum = 1;
        while (m > 0){
            sum *= n;
            n--;
            m--;
        }
        return sum;
    }
    public static int combinationNumber(int m, int n){
        return arrayNumber(m,n)/arrayNumber(m,m);
    }
    public static void main(String args[]) {
        System.out.println(arrayNumber(2,4));
        System.out.println(combinationNumber(2,4));
    }
}

这种方法先求出排列数,而排列数是n!, 16! = 2004189184,就已经快超过int最大范围。所以,这种先求出排列数再求出组合数的方法值针对数量比较小的。

求法2


看到在各个展开式,我们可以把它拆开,变成(n/m) * (n-1)/(m-1) *…
这样就会出现一个问题,那就是(n/m)不一定会是整数,解决办法是继续再组合(n * (n-1))/m,如果还除不了就再乘上一个(n-2).
这样代码实现有一定困难,那么就把分母从n到(n-m+1),而分母从0到m,这样就能保证分子/分母一定是整数。

  • 代码实现
    public static int combinationNumber3(int m, int n){
        int cnt = 1;
        for(int i = 0; i < m; i++){
            cnt *= n - i;
            cnt /= i + 1;
        }
        return cnt;
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/306206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号