Оптимизировать код Java

import java.util.Scanner;
public class task {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int k = scan.nextInt();
        int d = scan.nextInt();
        for (int i = 0; i < 10; i++) {
            int pr = Integer.parseInt(String.valueOf(n) + String.valueOf(i));
            if (pr % k == 0) {
                System.out.println(pr + "0".repeat(d - 1));
                return;
            }
        }
        System.out.println(-1);
    }
}

Нужно, чтоб код быстрее работал. Как бы вы оптимизировали?


Ответы (1 шт):

Автор решения: Nowhere Man

В представленном коде основная задержка будет скорее всего при чтении данных из стандартного потока ввода. Затем идет цикл с фиксированным сверху количеством итераций (10).

Оптимизировать по большому счёту здесь нечего, если не считать операций конкатенации в цикле. В данном случае строковые операции совершенно не нужны, и их даже не следует заменять операциями со StringBuilder, так как достаточно обычных математических операций n * 10 + sign(n) * i (если заморачиваться на сохранение знака исходного числа n).

Также имеет смысл проверить соотношение |10*n| <= |k| <= |10*n| + 10, так как для больших k и ненулевого остаток от деления pr % k никогда не будет равен 0.

И наконец, можно сразу проверять значения из обоих концов диапазона, сокращая количество итераций вдвое.

Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int k = scan.nextInt();
int d = scan.nextInt();

int sign = n < 0 ? -1 : 1;  // знак n
n *= sign;                  // избавиться от знака в n
k = Math.abs(k);            // избавиться от знака в k
int m = 10 * (n + 1);       // граница цикла
if (n == 0 || k <= m) {
    for (int p1 = 10 * n, p2 = m - 1; p1 < p2; p1++, p2--) {
        if (p1 % k == 0) {
            System.out.println(sign * p1 + "0".repeat(d - 1));
            return;
        } else if (p2 % k == 0) {
            System.out.println(sign * p2 + "0".repeat(d - 1));
            return;
        }
    }
}
System.out.println(-1);

Однако следует повторить, что у исходного алгоритма вычислительная сложность практически постоянна (не зависит от величины n), так что выигрыш в "скорости" будет пренебрежимо мал.

→ Ссылка