делить на ноль ошибок - PullRequest
       33

делить на ноль ошибок

5 голосов
/ 10 марта 2010

вот код (java):

class prime
{

    public static boolean prime (int a, int b) 
    { 
        if (a == 0) 
        {
            return false; 
        }
        else if ((a%(b-1) == 0) && (b>2))
        {
            return false; 
        }
        else if (b>1) 
        {
            return (prime (a, b-1)) ;
        }
        else
        {
            return true; 
        }

    }

    public static void main (String[] arg) 
    {
        System.out.println (prime (7, 7)) ; 
    }
}

Это сообщение об ошибке, которое я получаю, когда пытаюсь его запустить (оно прекрасно компилируется):

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at prime.prime(prime.java:10)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.main(prime.java:27)

Значит, это значит, что я разделил на ноль кое-что, как правильно? или это что-то еще значит? Я не вижу, как я делю на ноль. Что пошло не так?

Ответы [ 4 ]

14 голосов
/ 10 марта 2010

Попробуйте перевернуть это

if ((a%(b-1) == 0) && (b>2))

до

   if ((b>2) && a%(b-1)==0)

Происходит следующее: операция a%(b-1) выполняется перед тестом b>2.

После переключения вы используете оценку короткого замыкания . Как только тест b> 2 возвращает false, нет необходимости вычислять модуль (следовательно, избегая деления)

2 голосов
/ 10 марта 2010

Из-за вашего рекурсивного вызова:

return (prime (a, b-1)) ;

В какой-то момент вы будете вызывать простое число со значением b, равным 1. Это означает, что при вашем втором условии вы будете тестировать a%0. Поскольку оператор по модулю (%), по сути, является делителем, это означает, что вы делите на ноль.

Решение, вероятно, состоит в том, чтобы поймать этот случай для принудительного применения b> 2 в вашем состоянии перед выполнением%.

1 голос
/ 12 сентября 2018
 A % B = C

Математическое значение для % состоит в том, что вы делите A на B и напоминание об этой операции: C.Когда B равно 0, вы фактически спрашиваете: что является напоминанием, когда мы делим на ноль?В математике деление на ноль не определено, и это является причиной java.lang.ArithmeticException

0 голосов
/ 10 марта 2010

Я предполагаю, что любой код вида x % 0 выдаст эту ошибку. Ваш код не защищает от этой возможности.

...