Разделите на ноль, не могу найти проблему в этой программе, которая запускает алгоритм Евклида, чтобы найти наибольший общий делитель

public static long[] simp (long [] a) {
    long c = a[0];
    long d = a[1];
    if ( a[0]<0 ) {
        a[0] = -1*a[0];
    }
    if (a[1]>a[0]) {
        long v = a[0];
        a[0]=a[1];
        a[1]=v;
    }
    while (a[1] > 0) {
        long t = a[0];
        a[0] = a[1];
        a[1] = t%a[1];
        System.out.println(a[0]+"/"+a[1]);
    }
    a[0] = c/a[0];
    a[1] = d/a[0];
    System.out.println(a[0]+"/"+a[1]);
    return a;
}

Я следовал шагам алгоритма Евклида, но был ошеломлен, когда появилась задача деления на ноль. Я не знаю, как это может произойти.

Ваш вопрос неполный: какие входные данные, которые вы предоставили, вызывают деление на ноль, и в какой строке происходит деление на ноль?

rzwitserloot 28.12.2022 10:50

также обратите внимание, что почти все ваши строки ничего не делают (от if (a[0] < 0 до a[0] = c/a[0] — сначала вы устанавливаете c, затем много работаете над a[0] и a[1], затем отбрасываете все это и используете c.

rzwitserloot 28.12.2022 10:51

Я не могу воспроизвести, передав положительные значения вашему методу. Когда я передаю массив, содержащий 0 и неотрицательное значение, я получаю ошибку деления на 0. Простое решение: задокументируйте в своем комментарии JavaDoc, что ваш метод выдаст ArithmeticException в этом случае: Лучшее решение: подтвердите свой аргумент. Если это что-то иное, чем массив длины 2, содержащий два строго положительных числа, бросьте IllegalArgumenttException с понятным для понимания сообщением об ошибке.

Ole V.V. 28.12.2022 11:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в следующих двух строках.

a[0] = c/a[0];
a[1] = d/a[0];

Первый оператор сделает a[0] равным 0, поскольку c равно 0. Следующим оператором будет 1/0.

Я пропустил его. Отлично, большое спасибо

Bryan Griffin 28.12.2022 12:02

Это не совсем то, что происходит. Если a[0] уже был равен 0 с самого начала, первым оператором будет 0/0, что вызовет исключение. Если a[0] не было 0, то c тоже не будет, и ни одно из утверждений не должно создавать проблем.

Ole V.V. 28.12.2022 14:27

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