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

C++ 实现计算组合数(一乘一除法附讲解)

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

C++ 实现计算组合数(一乘一除法附讲解)

Cnm = n! /(m! * (n - m)!)

此时 n! 可以和 (n - m)! 约去得到 (n - m + 1) ~ n ,共 m 个数

而剩下的 1 / m! 也是 m 个数,

   所以可以在代码中通过m个循环反复先乘后除缩小数据规模

long long C(int n, int m){
    if(n == m || m == 0){
        return 1;
    }
    //替换为等价值中较小的,减少循环次数
    m = min(m, n - m);
    long long res = 1;
    for(int i = 1; i <= m; ++i){
        res = res * (n - m + i) / i;
        // res *= (n - m + i) / i 这种写法会先计算除法,可能损失数据造成计算错误
    }
    return res;
}

在这个过程中总是能除尽的,因为当除数取到 i 时,被除数已经有连续的 i 个数相乘,连续的i个数中必然有能整除 i 的。如当 i 取 3 时, 已经有连续的 3 个数如 77 78 79 ,有78可以整除,即使78 提前被 2 除了也不要紧,因为 3 是 78 的因数,可看作 3 * 26 = 78, 26 被 2 除为 14 不会引起 3 这个因数的损失。

 参考:

C++求解组合数的具体实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938025.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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