1

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

先感谢您。

4

2 回答 2

1

你看到一个溢出。尝试以下输入,您可以获得 ArithmeticException。

1
256 256
于 2013-06-05T03:57:23.760 回答
0

如果b*c很大,j最终将等于(=2 16 ) 并且将是(请记住,Java始终是 32 位)。当除数为时执行会导致您的. 请注意,任何倍数都会导致此错误。上面最初引用的(=2 31 -2 16 ) 只是适合.2147418112 65536j*j0ints%0ArithmeticException655362147418112int

示例代码(您可以在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!");
    }
}
于 2013-06-05T03:48:59.237 回答