Оптимизировать код 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 шт):
В представленном коде основная задержка будет скорее всего при чтении данных из стандартного потока ввода. Затем идет цикл с фиксированным сверху количеством итераций (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
), так что выигрыш в "скорости" будет пренебрежимо мал.