为什么暗示我除以零?

时间:2013-06-05 03:25:43

标签: java if-statement divide-by-zero arithmeticexception

我正在解决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不同,所以没有理由除以零,这是我自己找到的唯一解释。

提前谢谢。

2 个答案:

答案 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!");
    }
}