In mathematics, any of the positive integers that occurs as a coefficient in the binomial theorem is a binomial coefficient. Commonly, a binomial coefficient is indexed by a pair of integers n ≥ k ≥ 0 and is written {\displaystyle {\tbinom {n}{k}}.} {\displaystyle {\tbinom {n}{k}}.} It is the coefficient of the xk term in the polynomial expansion of the binomial power (1 + x)n, and it is given by the formula.java
英文描述請參考下面的圖。git
根據給定的公式計算二項式的值。github
在這裏有一個說明須要注意的是,若是結果超過 1,000,000,000 你的程序應該返回 -1。ide
若是結果沒有定義的話,那麼你的程序應該也要返回 -1。測試
在這裏的計算,公式比較簡單,就是計算 N,K N-K 的階乘,在階乘中,你能夠使用遞歸進行計算。spa
可是須要注意的是對這個數字的階乘計算量,程序是很容易溢出的,若是從出題者的意圖來看就是要考察大數值的計算和計算中的溢出。debug
若是你使用的是 Java 的話,你應該使用類 BigDecimal,進行計算。若是你能夠使用 Apache Common Math 的話,你就直接使用 CombinatoricsUtils.factorialDouble 進行計算。在計算中容許的最大參數值爲 170,超過這個值之後就超過程序可以計算的最大值了。code
若是你但願直接計算二項式係數的話,你能夠使用 CombinatoricsUtils.binomialCoefficientDouble(40, 20) 直接進行計算。orm
源代碼和有關代碼的更新請訪問 GitHub:遞歸
測試類請參考:
代碼思路請參考:
/** * https://www.cwiki.us/display/ITCLASSIFICATION/Binomial+Coefficient * * Binomial Coefficient */ @Test public void testBinomialCoefficient() { int n = 40; int k = 20; BigDecimal bc = factorial(n).divide(factorial(k).multiply(factorial(n - k))); // a.compareTo(new BigDecimal(1000000000)) logger.debug("{}", bc); logger.debug("Check for Compare To - [{}]", bc.compareTo(new BigDecimal(1000000000))); logger.debug("Value - [{}]", bc); logger.debug("Apache CombinatoricsUtils Factorial - [{}]", CombinatoricsUtils.factorialDouble(20)); logger.debug("Apache CombinatoricsUtils Binomial Coefficient - [{}]", CombinatoricsUtils.binomialCoefficientDouble(40, 20)); } /** * for factorial * * @param x * @return */ private static BigDecimal factorial(int x) { if (x == 1 || x == 0) { return BigDecimal.valueOf(1); } else { return BigDecimal.valueOf(x).multiply(factorial(x - 1)); } }
上面程序的測試結果以下:
2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - 137846528820 2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Check for Compare To - [1] 2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Value - [137846528820] 2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Apache CombinatoricsUtils Factorial - [2.43290200817664E18] 2018/12/29 19:35:10 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - Apache CombinatoricsUtils Binomial Coefficient - [1.3784652882E11]