Почему это означает, что я делю на ноль?
Я решаю несколько упражнений из 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
будет в конечном итоге равным 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!");
}
}
Вы видите переполнение. Попробуйте следующий ввод, и вы можете получить ArithmeticException.
1
256 256