c - 使用 C 中的置换 (nPr, nCr) 函数避免整数溢出

标签 c math statistics

我正在尝试做一些与统计相关的功能,这样我就可以执行一些相关的程序(即:概率的统计计算,为任意深度生成帕斯卡三角形等)。

我遇到了一个可能要处理溢出的问题。例如,如果我想计算 (n=30,p=1) 的 nPr,我知道我可以将其简化为:

30P1 = 30! / (30 - 1)!
     = 30! / (29)!
     = 30! / 29!
     = 30

但是,当使用下面的函数进行计算时,由于整数溢出,我似乎总是会得到无效值。是否有不需要使用库来支持任意大数字的解决方法?我已经阅读了一些关于 Gamma 函数的其他帖子,但找不到具体示例。

int factorial(int n) {
   return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
}


int nCr(int n, int r) {
   return (nPr(n,r) / factorial(r));
   //return factorial(n) / factorial(r) / factorial(n-r));
}


int nPr(int n, int r) {
   return (factorial(n) / factorial(n-r));
}

最佳答案

这是一种不使用 Gamma 函数的计算方法。 它依赖于 n_C_r = (n/r) * ((n-1)C(r-1)) 并且对于任何正值,n_C_0 = 1 所以我们可以用它写一个递归函数,如下所示

public long combination(long n, long r) {
    if(r==0)
        return 1;
    else {
        long num = n * combination(n - 1, r - 1);
        return num/r;
    }
}

关于c - 使用 C 中的置换 (nPr, nCr) 函数避免整数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11016069/

相关文章:

c - 用于从 c 文件中提取函数调用的 Bash 脚本

python - 计算最小二乘拟合的置信带

c - 来自不兼容指针类型的警告分配

c - 从秒开始的快速时间结构

ruby - 如何在 Ruby 中对数字数组求和?

c++ - 防止长时间运行平均溢出?

javascript - js中如何使用科学计数法?

.net - 使用不同的.Net 语言?

r - 在 R 中将 `rnorm` 作为另一个 `rnorm` 的参数意味着什么?

c - 如何使用 RSA 加密/解密长输入消息? [OpenSSL, C]