Матч
326, Циклы
прибавлений (AdditionCycles)
Дивизион 2,
Уровень 1
Имеется число n в
границах от 00 до 99, записанное двумя цифрами (если число меньше 10, то перед
ним стоит ведущий 0). Сложим цифры числа. Припишем к правой цифре первого числа
правую цифру суммы и получим новое число. Если повторять несколько раз
описанную процедуру, то снова можно получить n. Например:
число |
сумма
цифр |
конкатенация
цифр |
26 |
2 + 6
= 8 |
68 |
68 |
6 + 8
= 14 |
84 |
84 |
8 + 4
= 12 |
42 |
42 |
4 + 2
= 06 |
26 |
По заданному числу n
следует найти количество шагов описанных преобразований, через которое можно
снова получить n.
Класс: AdditionCycles
Метод: int cycleLength(int n)
Ограничения:
0 £ n £ 99.
Вход. Целое число n.
Выход. Число шагов преобразований, после выполнения которых снова
появится число n.
Пример входа
n |
26 |
55 |
0 |
Пример выхода
4
3
1
РЕШЕНИЕ
элементарные вычисления
В задаче достаточно
промоделировать описанный процесс преобразования числа. Начиная со входного
значения n, повторяем процесс
преобразования, пока снова не получим это же число. Параллельно подсчитываем
количество таких преобразований в переменной len.
Описанное преобразование над
числом n можно записать и одной
командой:
n = n%10*10 + (n%10 + n/10)%10
ПРОГРАММА
#include <stdio.h>
class AdditionCycles
{
public:
int cycleLength(int
n)
{
int sum, k = -1, len = 0, Initn = n;
while(Initn != k)
{
sum = n % 10 + n / 10;
k = n % 10 * 10 + sum % 10;
len++; n = k;
}
return len;
}
};
Программу можно упростить
следующим образом, записав преобразование числа в одной команде:
#include <stdio.h>
class AdditionCycles
{
public:
int cycleLength(int
n)
{
int len = 0, Initn = n;
do{
n = n % 10 * 10 + (n % 10 + n / 10) % 10,
len++;
} while(n != Initn);
return len;
}
};