Задано натуральное [latex]M[/latex]. Если число не палиндром – записываем его в обратном порядка и слагаем с заданным. Действия повторяем до тех пор, пока не получим число-палиндром. Количество выполненных операций назовем уровнем палиндромности заданного числа.
Найти уровень палиндромности заданного числа [latex]M[/latex].
Входные данные
Единственное число [latex]M[/latex] ([latex]0[/latex] [latex] <[/latex] [latex]M[/latex] [latex] <[/latex] [latex]10000[/latex]).
Выходные данные
Единственное число – уровень палиндромности.
Задача взята с сайта e-olymp.
Тесты
Входные данные | Выходные данные |
1 | 0 |
79 | 6 |
101 | 0 |
198 | 5 |
865 | 2 |
9998 | 6 |
Алгоритм
В данной задаче для заданного числа требуется определить уровень его палиндромности — количество раз, которое придется просуммировать его с обратным ему числом до получения палиндрома.
- Для начала инициализируем счетчик, который хранит в себе текущее значение уровня палиндромности, и логическую переменную, значение которой ложно до тех пор пока палиндром не найден. Данное условие и будет критерием для выполнения тела основного цикла.
- Присвоив значения переменным в цикле, выполняем последовательный разбор введенного числа на цифры и сборку «зеркального» числа.
- Проверяем равенство числа и ему обратного.
- Выполнение условного оператора сигнализирует о том, что палиндром найден, следовательно выводим «уровень», изменяем значение логической переменной на противоположное и выходим из цикла.
- В противном случае суммируем текущее число и «зеркальное», инкрементируем счетчик.
- Повторяем пункты 2, 3, 5 до истинности пункта 3 и перехода к 4.
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> using namespace std; int main() { long x, x1, x2;// переменные для хранения числа, его копии и числа записанного в обратном порядке соответственно int c; int k = 0;// счетчик "уровня палиндромности" cin >> x; bool f = false;// флаг выполнения условия палиндромности числа while(!f){ x1 = x; x2 = 0; while (x1 > 0){ c = x1%10; x1 /= 10; x2 = x2*10 + c;// собираем число записанное в обратном порядке } if (x == x2){ cout << k;// выводим счетчик, если число палиндром f = true; break;// выход из цикла, при условии, что палиндром найден } else { x += x2;// суммируем значение числа и обратно записанного, если оно не является палиндромом k++; } } return 0; } |
Мне нравится. И решение и текст.
Зачтено