Есть ли лучший способ написать этот фрагмент кода?

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

        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);

Что касается эффективности вопроса, пусть об этом побеспокоится компилятор, а вместо этого стремитесь к максимальной читабельности.

teapot418 26.06.2024 22:51

Для дальнейшего использования вы можете выполнить поиск в Интернете с помощью «Приоритета оператора Java». Вот один из результатов: introcs.cs.princeton.edu/java/11precedence

Old Dog Programmer 26.06.2024 23:09

Если не считать точности кода, это всего лишь пять строк, и вы вносите существенный вклад только в одну из них. Вы ничего не можете сделать, чтобы что-то существенно изменить. Если бы у вас было больше кода (50 строк? 500 строк? больше?), все могло бы быть по-другому.

Tangentially Perpendicular 26.06.2024 23:11

теоретические улучшения: (первое решение) делайте умножения только один раз (a = a*a или aa = a*a). Также обратите внимание, что второе решение после исправления (теоретически) лучше первого, поскольку умножение не будет выполняться, если какое-то значение отрицательно (более простой тест), но разница незначительна (по сравнению, например, с parseDouble)

user85421 27.06.2024 01:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Из-за приоритета операторов это выражение:

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)

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