pol*_*nts 97
N choose K
即使没有计算因子,它实际上也很容易计算.
我们知道的公式(N choose K)
是:
N!
--------
(N-K)!K!
Run Code Online (Sandbox Code Playgroud)
因此,公式为(N choose K+1)
:
N! N! N! N! (N-K)
---------------- = --------------- = -------------------- = -------- x -----
(N-(K+1))!(K+1)! (N-K-1)! (K+1)! (N-K)!/(N-K) K!(K+1) (N-K)!K! (K+1)
Run Code Online (Sandbox Code Playgroud)
那是:
(N choose K+1) = (N choose K) * (N-K)/(K+1)
Run Code Online (Sandbox Code Playgroud)
我们也知道(N choose 0)
:
N!
---- = 1
N!0!
Run Code Online (Sandbox Code Playgroud)
所以这给了我们一个简单的出发点,并使用上面的公式,我们可以找到(N choose K)
任何K > 0
与K
乘法和K
部门.
综合以上内容,我们可以轻松生成Pascal三角形,如下所示:
for (int n = 0; n < 10; n++) {
int nCk = 1;
for (int k = 0; k <= n; k++) {
System.out.print(nCk + " ");
nCk = nCk * (n-k) / (k+1);
}
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
这打印:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Run Code Online (Sandbox Code Playgroud)
BigInteger
版应用公式BigInteger
很简单:
static BigInteger binomial(final int N, final int K) {
BigInteger ret = BigInteger.ONE;
for (int k = 0; k < K; k++) {
ret = ret.multiply(BigInteger.valueOf(N-k))
.divide(BigInteger.valueOf(k+1));
}
return ret;
}
//...
System.out.println(binomial(133, 71));
// prints "555687036928510235891585199545206017600"
Run Code Online (Sandbox Code Playgroud)
据谷歌称,133选择71 = 5.55687037×10 38.
the*_*ega 44
apache-commons"Math"在org.apache.commons.math4.util.CombinatoricsUtils中支持这一点
dim*_*414 21
该递归定义为您提供了一个非常简单的选择功能,将工作的优良小的值.如果您计划大量运行此方法,或者使用较大的值,则需要记住它,但是否则可以正常工作.
public static long choose(long total, long choose){
if(total < choose)
return 0;
if(choose == 0 || choose == total)
return 1;
return choose(total-1,choose-1)+choose(total-1,choose);
}
Run Code Online (Sandbox Code Playgroud)
改进这个函数的运行时间留给读者 :)
Blu*_*eft 13
我只想计算不同甲板大小的2张牌组合的数量......
无需导入外部库 - 从组合的定义,可以使用n
卡片n*(n-1)/2
额外问题: 这个相同的公式计算第一个n-1
整数的总和- 你知道为什么它们是相同的吗?:)