用于计算nCr抛出算术异常的Java程序"除以零"

时间:2015-02-25 06:27:33

标签: java algorithm combinations

以下代码尝试计算给定n的各种值的nCr值,此处r从0到n变化。

输入格式如下: -

输入格式

第一行包含测试用例数T. T行跟随每个包含整数n。

约束

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

输出格式

对于每个n输出,nC0到nCn的列表每个由新行中的单个空格分隔。如果数字很大,则仅打印最后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上测试时,它将算术异常“除以零”。

以下是例外日志: -

      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)

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

1 个答案:

答案 0 :(得分:4)

您必须使用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;
}