我正在解决HackerRank.com的一些练习,代码在Netbeans上完美运行,甚至在测试用例的页面编译器中,但是当我提交代码时,它会在每个测试中抛出这个错误(除了最后一个) :
ArithmeticException:抛出Solution.main(Solution.java:15)
以下是代码:
Scanner s = new Scanner(System.in);
int a = s.nextInt(),j=1;
for(int i=0; i<a; i++){
int b = s.nextInt(), c =s.nextInt();
for(j = b*c; j>0;j--) {
if((b*c)%(j*j)==0){
System.out.println(b*c/(j*j));
break;}
}
}
第15行是:
if((b*c)%(j*j)==0){
声明有什么问题? 我在for循环中将'j'设置为与0不同,所以没有理由除以零,这是我自己找到的唯一解释。
提前谢谢。
答案 0 :(得分:1)
你看到了溢出。 尝试以下输入,您可以获得ArithmeticException。
1
256 256
答案 1 :(得分:0)
如果b*c
很大,j
最终会等于 2147418112
65536
(= 2 16 ) j*j
将为0
(请记住,Java ints
始终为32位)。当除数为%
时执行0
会产生ArithmeticException
。请注意,65536
的任何倍数都会导致此错误。上面最初引用的2147418112
(= 2 31 -2 16 )只是适合int
的最大倍数。
示例代码(您可以在http://ideone.com/iiKloY处自行运行):
public class Main
{
public static void main(String []args)
{
// show that all multiples of 65536 yeild 0 when squared
for(int j = Integer.MIN_VALUE; j <= Integer.MAX_VALUE - 65536; j += 65536)
{
if((j*j) != 0)
{
System.out.println(j + "^2 != 0");
}
}
System.out.println("Done!");
}
}