1544. На редкость простая задача

 

n – произвольное натуральное число, которое по некоторым причинам содержит не менее двух цифр. Джон До, невзрачный человек, выполняет с n следующую операцию: он отбрасывает последнюю цифру и получает новое число m, после чего вычисляет nm . Это его слишком радует. Потом он называет Вам число nm. Вы в восторге от подобных преобразований. Ваша задача по указанной разности восстановить само число n.

 

Вход.  Каждая строка является отдельным тестом и содержит одно натуральное число от 10 до 1018 включительно, которое равно nm. Последняя строка содержит 0 и не обрабатывается.

 

Выход. Для каждого теста в отдельной строке вывести все возможные значения n в возрастающем порядке. Последовательно выводимые числа следует разделять одним пробелом.

 

Пример входа

Пример выхода

18

0

19 20

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Пусть n = 10 * x + a, где а – последняя цифра числа n (0 £ a £ 9). Тогда m = x, nm = 10 * x + ax = 9 * x + a. Обозначим k = nm. Тогда a = k mod 9, x = (ka) / 9. Очевидно, что искомым будет n = 10 * x + a = 10 * (ka) / 9 + k mod 9.

Если a = k mod 9 = 0, то последняя цифра a может равняться 9, так как 9 mod 9 = 0. Тогда x = (k – 9) / 9 = k / 9 – 1, откуда n = 10 * x + a = 10 * (k / 9 + 1) + 9.

Таким образом если значение nm делится на 9, то существует два разных значения n. Иначе – одно.

 

Пример

Если n = 19, то m = 1 и nm = 18. При n = 20 получим m = 2 и nm = 18. Если nm = 18 (делится на 9), то существует два разных значения n: 19 и 20.

 

Реализация алгоритма

Объявим переменные a, n, x типа long long.

 

long long a, k, x;

 

Вводим k = nm. Последовательно вычисляем значения a, x и выводим результат согласно приведенному выше анализу.

 

while(scanf("%lld",&k), k)

{

  a = k % 9;

  x = (k - a) / 9;

  if (!a) printf("%lld ",10 * (x - 1) + 9);

  printf("%lld\n",10 * x + a);

}