Почему это означает, что я делю на ноль?

Я решаю несколько упражнений из 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){

Что не так с утверждением? Я установил 'j' отличным от 0 в цикле for, поэтому нет причин для деления на ноль, что было единственным объяснением, которое я смог найти сам.

Заранее спасибо.

2 ответа

Решение

Если b*c большой, j будет в конечном итоге равным 214741811265536 (= 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!");
    }
}

Вы видите переполнение. Попробуйте следующий ввод, и вы можете получить ArithmeticException.

1
256 256
Другие вопросы по тегам