我计算了数字的排列: -
nPr = n!/(n-r)!
其中给出了n和r。
1<= n,r <= 100
i find p=(n-r)+1
and
for(i=n;i>=p;i--)
multiply digit by digit and store in array.
但是我怎么计算nCr = n!/ [r! *(n-r)!]对于相同的范围。?
我使用递归做了如下: -
#include <stdio.h>
typedef unsigned long long i64;
i64 dp[100][100];
i64 nCr(int n, int r)
{
if(n==r) return dp[n][r] = 1;
if(r==0) return dp[n][r] = 1;
if(r==1) return dp[n][r] = (i64)n;
if(dp[n][r]) return dp[n][r];
return dp[n][r] = nCr(n-1,r) + nCr(n-1,r-1);
}
int main()
{
int n, r;
while(scanf("%d %d",&n,&r)==2)
{
r = (r<n-r)? r : n-r;
printf("%llu\n",nCr(n,r));
}
return 0;
}
但范围为n <= 100,这对于n> 60不起作用。
答案 0 :(得分:2)
考虑使用BigInteger类型来重新分析您的大数字。 BigInteger提供Java和C#(.NET Framework的4+版本)。从您的问题来看,您似乎正在使用C ++(您应该始终将其添加为标记)。因此,请尝试查看here和here以获取可用的C ++ BigInteger类。
我所看到的计算二项式系数的最佳方法之一是Mark Dominus。与其他一些方法相比,N和K的值越大越不可能溢出。
static long GetBinCoeff(long N, long K)
{
// This function gets the total number of unique combinations based upon N and K.
// N is the total number of items.
// K is the size of the group.
// Total number of unique combinations = N! / ( K! (N - K)! ).
// This function is less efficient, but is more likely to not overflow when N and K are large.
// Taken from: http://blog.plover.com/math/choose.html
//
if (K > N) return 0;
long r = 1;
long d;
for (d = 1; d <= K; d++)
{
r *= N--;
r /= d;
}
return r;
}
只需用BigInt替换所有长定义,你就应该好了。