@konstantinst13

Можно ли как-то улучшить и упростить этот код?

Нам задали такое задание:
6360bb3fc5e95358992204.png

import java.util.Scanner;

public class task {
    // вычисляет: ax^3 + bx^2 + cx + d с коэффициентами и иксом:
    public static int f(int a, int b, int c, int d, int x)
    {
        return (a * x * x * x) + (b * x * x) + (c * x) + d;
    }
    public static int abs(int d)  // Возвращает модуль числа
    { return d > 0 ? d : -d; }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // Коэффициенты уравнения
        System.out.println("Введите a, b, c, d");
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        int d = scanner.nextInt();

        if(a == 0 || d == 0){
            System.out.println("a и d не должны быть равны нулю!");
            return;
        }

        int i = 1;
        int iters = abs(d)/2;

        // пока счётчик меньше половины d
        while (i <=  iters )
        {

            // если счётчик является делителем d
            if (d % i == 0)
            {
                if (f(a, b, c, d, i) == 0) // и в то же время является корнем уравнения
                {
                    System.out.println("Положительный корень: " + i);
                }
                if (f(a, b, c, d, -i) == 0) // если противоположное число тоже является корнем
                {
                    System.out.println("Отрицательный корень: " + -i);
                }
            }
            i++;
        }
    }
}
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Можно начать с разложения d на простые числа (это про улучшение кода в смысле перформанса).

Вот это выражение вычисляется дважды. Там просто x меняется с положительного на отрицательный.
(a * x * x * x) + (b * x * x) + (c * x) + d;
А частично расчитанные слагаемые мы теряем. И потом считаем их снова. Это дефект избыточных расчетов.
Можно над этим подумать.

По поводу упрощения кода. Тут надо решить что тебе надо. Краткий код. Или быстрый. Это два противоречия.
Вспоминаем "кривую Шипилёва".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Немного ускорить код можно без особого усложнения.
1. Проверять делители до ceil(sqrt(abs(d))), а не до d/2. Ceil для того, чтобы компенсировать возможную погрешность в вычислении корня.
2. Найдя делитель i проверять не только его, но и парный d/i.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы