Java 计算 nCr 抛出算术异常的程序 "Divide by zero"

Java Program to compute nCr throwing Arithmetic Exception "Divide by zero"

以下代码尝试计算给定 n 的各种值的 nCr 值,这里 r 从 0 到 n。

输入格式如下:-

输入格式

第一行包含测试用例数量T。 接下来是 T 行,每行包含一个整数 n.

约束条件

 1<=T<=200 
 1<=n< 1000

输出格式

对于每个 n 输出 nC0 到 nCn 的列表,每个列表由一个新行中的单个 space 分隔。如果数字很大,只打印最后 9 位数字。即模 10^9

所以示例输入的格式如下:-

 3
 2
 4
 5

样本输出格式如下:-

 1 2 1
 1 4 6 4 1
 1 5 10 10 5 1    

这是代码

 import java.io.*;
 import java.util.*;
 import java.math.*;

public class Solution {

  public static void main(String[] args) {
      /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int j = 0;

    for(int i = 0; i < n; i++){
        int a = scan.nextInt();
        j = 0;
        while(j <= a){
              if( j == 0 || j == a){
                  System.out.print(1 + " ");
              }
              else if( j == 1 || j == (a - 1)){
                  System.out.print(a + " ");
              }else{
                  BigInteger  a1 = (Num(a,j));
                  BigInteger b1 = BigInteger.valueOf(fact(j));
                  BigInteger c1 = a1.divide(b1);
                  BigInteger x1 = BigInteger.valueOf(1000000000);
                  System.out.print( c1.mod(x1)  +" ");
              } 
            j++;
        }
        System.out.println();

    }
}

public static BigInteger Num(int a, int j){
    BigInteger prod = BigInteger.valueOf(1);
    for(int k = 0; k < j; k++){
        int z = a - k;
        BigInteger b = BigInteger.valueOf(z);
        prod = prod.multiply(b);
    }
    return prod;
}

public static long fact(long j){
    long prod = 1;
    for(long i = j; i > 0; i--){
       prod *= i; 
    }
    return prod;
 }
}

它清除了一些测试用例,但在许多测试用例中都失败了。 说 运行 时间错误,当我在输入 1 999 时对其进行测试时它抛出了算术异常 "Divide by zero"。

这是异常日志:-

      Exception in thread "main" java.lang.ArithmeticException: BigInteger divide by zero
        at java.math.MutableBigInteger.divideKnuth(MutableBigInteger.java:1179)
        at java.math.BigInteger.divideKnuth(BigInteger.java:2049)
        at java.math.BigInteger.divide(BigInteger.java:2030)
        at Solution.main(Solution.java:25)

需要做什么来解决这个问题?

您必须使用 BigInteger 来计算不超过 1000 的阶乘。

public static BigInteger fact(long j){
  BigInteger prod = BigInteger.ONE;
  for(long i = j; i > 0; i--){
    BigInteger f = BigInteger.valueOf( i );
    prod = prod.multiply( f ); 
  }
  return prod;
}