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,但我不知道如何解决该问题。

请帮忙。

更新:感谢您的回答。你们都弄清楚了问题所在,但是还有另一个问题是循环迭代的时间少了一次,因为i最初设置为 1。我将其设置为 0 并且它起作用了!

4

4 回答 4

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;
}
于 2013-12-08T09:37:46.570 回答
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。所以你应该检查这个特殊情况,如果数字为 0,则返回 1。

于 2013-12-08T09:37:47.173 回答
1

如果 num 为零,则需要从阶乘函数返回 1。阶乘 0 等于 1。

 if(num > 0) {
        for ( int c = 1 ; c <= num ; c++ )
            factorial = factorial*c;
    } else {
        return 1;
    }
于 2013-12-08T09:38:49.583 回答
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);
}

在您的情况下,由于最终产品中缺少 27 的 C(3,0)*3^0*3^3 。这就是为什么你得到216 - 27 = 189

于 2013-12-08T09:38:51.357 回答