2013-12-08 75 views
0

思考了1個小時之後,我仍然無法弄清楚我的計算器有什麼問題。我做了3個功能,其中包括main(),calculateBinomialTheorem()factorial()。是的,factorial()來計算係數。這個二項式定理計算器有什麼問題?

public static void main(String[] args) { 

    Scanner a_input = new Scanner(System.in); 
    Scanner b_input = new Scanner(System.in); 
    Scanner n_input = new Scanner(System.in); 

    int a = 0; 
    int b = 0; 
    int n = 0; 

    System.out.println("Welcome to Binomial Theorem Solver:"); 

    System.out.print("a: "); 
    a = a_input.nextInt(); 

    System.out.print("b: "); 
    b = b_input.nextInt(); 

    System.out.print("n: "); 
    n = n_input.nextInt(); 

    System.out.print(calculateBinomialTheorem(a, b, n)); 

    a_input.close(); 
    b_input.close(); 
    n_input.close(); 
} 

private static int calculateBinomialTheorem(int a, int b, int n) { 
    int result = 0; 
    int coefficient = 0; 

    ArrayList<Integer> products = new ArrayList<Integer>(); 

    for(int i = 1; i <= n; i++) { 

     int product = 0; 

     coefficient = factorial(n)/(factorial(i) * factorial(n - i)); 
     product = (int) (coefficient*Math.pow(a, n - i)*Math.pow(b, i)); 

     products.add(product); 
    } 

    for(int c : products) { 
     result += c; 
    } 

    return result; 
} 

private static int factorial(int num) { 
    int factorial = 1; 

    if(num > 0) { 
     for (int c = 1 ; c <= num ; c++) 
      factorial = factorial*c; 
    } else { 
     return 0; 
    } 

    return factorial; 
} 

我試圖運行它的值爲3,3,3應該給我的答案216,但它沒有給!爲什麼?我每次使用這些值這樣運行它是我的錯誤:

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at binomial_thorem_solver.Main.calculateBinomialTheorem(Main.java:46) 
    at binomial_thorem_solver.Main.main(Main.java:29) 

我知道我將數0,但我沒有得到如何解決這個問題。

請幫忙。

更新:感謝您的答案。你們都知道問題是什麼,但是之後又出現了另一個問題,因爲這個循環迭代的次數少了一次,因爲waas最初設置爲1.我將它設置爲0,它工作正常!

+0

爲什麼你需要3臺掃描儀? –

+0

獲得(** a ** + ** b **)^ ** n **。 @BoristheSpider –

+1

掃描器從輸入流中讀取,你有3個輸入流嗎? (號)那麼你需要3臺掃描儀? (編號) –

回答

1

0!約定爲1。不是0.這可能會對您造成問題。

此外,for循環應該從0到n,而不是從1到n,因爲有n + 1個項。

您錯過了C(n,0)* a^0 * b^n部分,因爲您的迭代不會從0到n。

所以,你的循環應該是

for(int i = 0; i <= n; i++) { 

    int product = 0; 

    coefficient = factorial(n)/(factorial(i) * factorial(n - i)); 
    product = (int) (coefficient*Math.pow(a, n - i)*Math.pow(b, i)); 

    products.add(product); 
} 

在你的情況下,由於C(3,0)* 3^0 * 3^3爲27從最終產品的缺失。這就是爲什麼你得到216 - 27 = 189

+0

謝謝,但答案是「189」:/爲什麼? –

+0

你的循環應該從0到n,而不是從1到n。查看編輯。 – doptimusprime

+0

請在我的編輯中找到對'189'的解釋。 – doptimusprime

2

的問題是在你的factorial方法.. 0您階乘將返回0 ..

和你分度值與階乘的結果(即0).. 0的階乘是1。所以你的代碼應該是

private static int factorial(int num) { 
    int factorial = 1; 

    if(num > 0) { 
     for (int c = 1 ; c <= num ; c++) 
      factorial = factorial*c; 
    } else { 
     return 1; 
    } 

    return factorial; 
} 
+0

謝謝,但答案是「189」:/爲什麼? –

+0

我注意到的第一件事是因子問題..你的輸入是什麼? – stinepike

2

在第一次迭代,i = 1,您有:

coefficient = factorial(n)/(factorial(i) * factorial(n - i)); 

什麼是factorial(1)?根據你的代碼它是1。

什麼是dactorial(0)?根據你的代碼它是0(if(num > 0)false,所以你去else - 那裏你返回0)。

因此,正如例外情況告訴你的那樣,你試圖用零除。

如何解決這個問題?

0!被定義爲1,所以,你應該檢查這個特殊的情況下,返回1,如果數字是0。

+0

謝謝,但答案是「189」:/爲什麼? –

1

您需要從階乘functiom返回1,如果num是零。 階乘0等於1.

if(num > 0) { 
     for (int c = 1 ; c <= num ; c++) 
      factorial = factorial*c; 
    } else { 
     return 1; 
    } 
+0

謝謝,但答案是「189」:/爲什麼? –

+0

什麼是輸入? – suspectus