Я новичок в этом, мне было любопытно, смогу ли я написать код ниже более эффективно. Я не могу использовать циклы или условные операторы, только логические операторы.
double a = Double.parseDouble(args[0]);
double b = Double.parseDouble(args[1]);
double c = Double.parseDouble(args[2]);
boolean check = a * a + b * b == c * c || a * a + c * c == b * b
|| b * b + c * c == a * a;
StdOut.println(a > 0 && b > 0 && c > 0 && check);
Я попробовал приведенный ниже код, но возникла проблема: даже если значение (a,b,c) было отрицательным, оно продолжало возвращать значение true для этого аргумента командной строки: (-3 4 -5), не знаю почему.
double a = Double.parseDouble(args[0]);
double b = Double.parseDouble(args[1]);
double c = Double.parseDouble(args[2]);
boolean check = a > 0 && b > 0 && c > 0 && a * a + b * b == c * c || a * a + c * c == b * b
|| b * b + c * c == a * a;
StdOut.println(check);
Для дальнейшего использования вы можете выполнить поиск в Интернете с помощью «Приоритета оператора Java». Вот один из результатов: introcs.cs.princeton.edu/java/11precedence
Если не считать точности кода, это всего лишь пять строк, и вы вносите существенный вклад только в одну из них. Вы ничего не можете сделать, чтобы что-то существенно изменить. Если бы у вас было больше кода (50 строк? 500 строк? больше?), все могло бы быть по-другому.
теоретические улучшения: (первое решение) делайте умножения только один раз (a = a*a
или aa = a*a
). Также обратите внимание, что второе решение после исправления (теоретически) лучше первого, поскольку умножение не будет выполняться, если какое-то значение отрицательно (более простой тест), но разница незначительна (по сравнению, например, с parseDouble
)
Из-за приоритета операторов это выражение:
a > 0 && b > 0 && c > 0 && a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a
Рассматривается как:
(a > 0 && b > 0 && c > 0 && a * a + b * b == c * c) || (a * a + c * c == b * b) || (b * b + c * c == a * a)
Итак, это ИЛИ трех условий. Это не ваша предполагаемая группировка, поэтому вам придется добавлять круглые скобки вручную.
a > 0 && b > 0 && c > 0 && (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
Что касается эффективности вопроса, пусть об этом побеспокоится компилятор, а вместо этого стремитесь к максимальной читабельности.