c++ - 编写计算 nCr 值的程序 (C++)

标签 c++ binomial-coefficients

我在下面编写了代码来计算 n 个 testCount 值的 nCr。它似乎适合我的值(value)观,但 hacker earth 的测试用例失败,问题链接 http://www.hackerearth.com/problem/golf/minimal-combinatorial/description/ 谁能告诉我我的逻辑中潜在的谬误是什么

`#include <iostream>
 using namespace std;

 int main()
{
    int testCount; 
    int n , r;
    cin >> testCount;
    for (int i = 0 ; i < testCount ; i++)
    {

        long int a=1;
        long int b=1;
        long int c=1;
        cin >> n;
        cin >> r;
        for (int i = n ; i > 1 ; i--)
        {
             a = a * i;
        }
        for (int i = n-r; i >= 1 ; i--)
        {
            b=b*i;
        }
       for (int i=r;i >=1;i--)
       {
           c=c*i;
       }
       long int result=a/(b*c);
       cout << result<<"\n";
    }

    return 0;
}

` 简化分子和分母的情况

 `#include <iostream>
  using namespace std;

int main()
{
   int testCount; 
   int n , r;
   cin >> testCount;
  for (int i = 0 ; i < testCount ; i++)
  {

       long int numerator=1;
       long int denominator=1;
       cin >> n;
       cin >> r;
       for (int i = n ; i > r ; i--)
       {
          numerator = numerator * i;
       }
       for (int i = n-r; i >= 1 ; i--)
       {
           denominator=denominator*i;
       } 

       long int result=numerator/denominator;
       cout << result;
   }

    return 0;

} `

最佳答案

你的两个代码都可能溢出(即使结果应该适合 64 位整数)

你可以试试:

std::uint64_t cnr(int n, int r)
{
    std::uint64_t ans = 1;
    r = std::min(r, n - r);

    for(int j = 1; j <= r; j++, n--) {
        // all following do: ans = (ans * n) / j;
        // but the 2 first cases do some simplifications
        // to reduce the possibility of overflow

        if (n % j == 0) {
            ans *= n / j; 
        } else if (ans % j == 0) {
            ans = (ans / j) * n;
        } else {
            ans = (ans * n) / j;
        }
    }
    return ans;
}

关于c++ - 编写计算 nCr 值的程序 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682100/

相关文章:

arrays - 算法,以便我可以以某种方式索引 2^n 组合,这样我就可以在不使用数组的情况下从 1 的任何索引值回溯到 2^n

c++ - 如何使用实例渲染将每个实例数据(例如定位)传递给 OpenGL 3.2 中的着色器?

c++ - 在不同屏幕之间切换

C++ Speex 到 Flac 包装器/库

algorithm - 简化此指数算法的大 O 复杂性

找到固定 n 模 m 的前 r 个二项式系数之和的算法

c++ - 静态函数与 const 函数

c++ - 模运算符 (%) 给出不同的结果

algorithm - 如何有效地计算帕斯卡三角形中的一行?

arrays - 使用动态规划和一维数组的二项式系数