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;
}
Я следовал шагам алгоритма Евклида, но был ошеломлен, когда появилась задача деления на ноль. Я не знаю, как это может произойти.
также обратите внимание, что почти все ваши строки ничего не делают (от if (a[0] < 0
до a[0] = c/a[0]
— сначала вы устанавливаете c
, затем много работаете над a[0]
и a[1]
, затем отбрасываете все это и используете c
.
Я не могу воспроизвести, передав положительные значения вашему методу. Когда я передаю массив, содержащий 0 и неотрицательное значение, я получаю ошибку деления на 0. Простое решение: задокументируйте в своем комментарии JavaDoc, что ваш метод выдаст ArithmeticException
в этом случае: Лучшее решение: подтвердите свой аргумент. Если это что-то иное, чем массив длины 2, содержащий два строго положительных числа, бросьте IllegalArgumenttException
с понятным для понимания сообщением об ошибке.
Проблема заключается в следующих двух строках.
a[0] = c/a[0];
a[1] = d/a[0];
Первый оператор сделает a[0] равным 0, поскольку c равно 0. Следующим оператором будет 1/0.
Я пропустил его. Отлично, большое спасибо
Это не совсем то, что происходит. Если a[0]
уже был равен 0 с самого начала, первым оператором будет 0/0, что вызовет исключение. Если a[0]
не было 0, то c
тоже не будет, и ни одно из утверждений не должно создавать проблем.
Ваш вопрос неполный: какие входные данные, которые вы предоставили, вызывают деление на ноль, и в какой строке происходит деление на ноль?