首先,您可能會得到整數數據類型太大的數字...... Proof。
這個想法是,你一步一步...乘以股利隨後的數字,併除以除數隨後的數字。
public class Binom {
private long[][] mapped;
public Binom(){
mapped = new long[52][52];
}
public long binom(int n, int r) {
if (r == 0)
return 1;
if (r == 1)
return n;
if(r > n-r)
r = n-r;
long toReturn = 1;
for (int i = 1, m = n; i <= r; i++, m--){
toReturn = toReturn*m/i;
}
return toReturn;
}
public long[][] getMapped() {
return mapped;
}
}
我的風向標:
public class Benchmark {
public static void main(String[] args) {
long start = System.nanoTime();
Random random = new Random();
int count = 1;
Binom binom = new Binom();
long[][] mapped = binom.getMapped();
for (int i = 1; i <= 100_000_000; i++) {
int n = 1 + random.nextInt(52);
int r = 1 + random.nextInt(n);
long result = mapped[n-1][r-1];
if (result != 0) {
System.out.println(count++ + ". Binomial for n: " + n + " and r: " + r + " equals " + result + ".");
} else {
result = binom.binom(n, r);
mapped[n-1][r-1] = result;
System.out.println(count++ + ". Binomial for n: " + n + " and r: " + r + " equals " + result + ".");
}
}
System.out.println("The whole lasted " + ((System.nanoTime() - start)/1_000_000_000) + " seconds.");
}
}
輸出的結束:
99999995. Binomial for n: 3 and r: 3 equals 1.
99999996. Binomial for n: 19 and r: 17 equals 171.
99999997. Binomial for n: 26 and r: 20 equals 230230.
99999998. Binomial for n: 32 and r: 13 equals 347373600.
99999999. Binomial for n: 20 and r: 14 equals 38760.
100000000. Binomial for n: 3 and r: 3 equals 1.
The whole lasted 342 seconds.
但不打印,將會更快...你只需要計算二項式係數爲那些1378=(52*52/2)
對。
這似乎是一個功課問題。請嘗試編寫代碼以完成要求。然後問你是否有特定的問題。 – Bryce
當N和R很低時,您可能想使用Pascal三角公式,而不是您在問題文本中使用的公式。不過,值C(50,25)不適合'int',所以需要'long'。 – Gassa
1430二項式(除非我的數學錯誤,但它應該至少接近)和100mio二項式?只需建立一張桌子。或者這是關於二項式本身的計算嗎?並使用'long'來避免溢出。 – Paul