如何解决线程“main”java.lang.arithmetricException:/by 0中的异常?
以下是代码:如何解决线程“main”java.lang.arithmetricException:/by 0中的异常?,java,exception,combinations,Java,Exception,Combinations,以下是代码: import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Scanner; public class prob_c { public static void main(String args[]) throws IOException { Scanner x = null; try {
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class prob_c {
public static void main(String args[]) throws IOException {
Scanner x = null;
try {
x = new Scanner(new File("prob_c.in"));
} catch (FileNotFoundException ex) {
System.out.print("File not found!");
}
for (int a = 0; a < 10; a++) {
int counter = 0;
int n = x.nextInt();
int r = x.nextInt();
counter++;
long res = 1;
res = getFact(n) / (getFact(n - r) * getFact(r));
System.out.println(res);
}
}
public static long getFact(int j) {
long f = 1;
for (int i = j; i >= 1; i--) {
f *= i;
}
return f;
}
}
要处理大阶乘,您需要使用BigInteger类,而不是long来存储数字 如果将n到n-r+1的所有数字相乘,然后除以getFactr,或者将n到r+1的所有数字相乘,然后除以getFactr,那么计算getFactn/getFactn-r*getFactr的效率也会更高 你得到一个被零除的错误的原因是阶乘的二进制展开往往以很多零结束。例如,如果你写20!在二进制中,如果我正确计数,它以18个零结束。当你计算一个阶乘时,每次你乘以另一个偶数,你会得到更多的零
现在,如果你取一个以64个或更多的零结尾的数字,并尝试将其放入一个long中,那么除了最后64位以外的所有数字都将被截断-这是整数溢出。这意味着如果n-r或r足够大,getFactn-r*getFactr可以被截断为零。这就是零除误差的来源。很简单,只要写一个if条件检查零。你没办法阻止它。这是个不错的问题。我相信表面上被零除实际上是由计算阶乘时的整数溢出引起的;不是通过实际尝试除以零。令人遗憾的是,每个人都宁愿放弃投票或关闭投票,也不愿发布关于整数溢出和使用BigInteger而不是long的有用答案。您能编写引发异常的输入吗?prob_c.in5 3 5 2 5 4 2 10 7 20 9 52 5 100 0 75 30 1 28 18每行两个数字的内容