Матч 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;

  }

};