Перевірити, чи є чотиризначне число паліндромом

Формулювання. 
Дано чотиризначне число. Перевірити, чи є воно паліндромом.
Примітка: 
паліндромом називається число, слово або текст, які однакового читаються зліва направо і справа наліво. Наприклад, у нашому випадку це числа 1441, 5555, 7117 і т. д.
Приклади інших чисел-паліндромів довільній десяткової розрядності, не відносять-ся до розв'язуваної задачі: 3, 787, 11, 91519 і т. д.

Рішення. 
Для введення числа з клавіатури будемо використовувати змінну n. Введене число належить безлічі натуральних чисел і чотиризначних, тому воно свідомо більше 255, так що тип byte для його опису нам не підходить. Тоді будемо використовувати тип word.
Якими ж властивостями володіють числа-паліндроми? Із зазначених прикладів легко побачити, що в силу своєї однаковою «читаності» з двох сторін в них рівні перший і останній розряд, другий і передостанній і т. д. Аж до середини. Причому, якщо в числі непарна кількість розрядів, то серединну цифру можна не враховувати при перевірці, оскільки при виконанні названого правила число є паліндромом незалежно від його значення.
У нашій же задачі все навіть дещо простіше, оскільки на вхід подається чотиризначне число. А це означає, що для вирішення завдання нам потрібно лише порівняти 1 цифру числа з 4 і 2 цифру з третьою. Якщо виконуються обидві ці рівності, то число - паліндром. Залишається тільки отримати відповідні розряди числа в окремих змінних, а потім, використовуючи умовний оператор, перевірити виконання обох рівностей за допомогою булевського (логічного) вираження.
Однак не варто поспішати з рішенням. Може бути, ми зможемо спростити дану схему? Візьмемо, наприклад, вже згадане вище число 1441. Що буде, якщо розділити його на два  двозначних числа, перше з яких буде містити розряд тисяч і сотень вихідного, а друге - розряд десятків і одиниць вихідного. Ми отримаємо числа 14 і 41. Тепер, якщо друге число замінити на його реверсний запис, то ми отримаємо два рівних числа 14 і 14! Це перетворення цілком очевидно, так в силу того, що паліндром читається однаково в обох напрямках, він складається з двічі повторюваної комбінації цифр, і одна з копій просто повернена задом-наперед.
Звідси висновок: треба розбити вихідне число на два двозначних, одне з них реверсувати, а потім виконати порівняння отриманих чисел за допомогою умовного оператора if. До речі, для отримання реверсного запису другої половини числа нам необхідно додати ще дві змінні для збереження використовуваних розрядів. Позначимо їх як a і b, і будуть вони типу byte.
Тепер опишемо сам алгоритм:
1) Вводимо число n;
2) Присвоюємо розряд одиниць числа n змінної a, потім відкидаємо його. Після присвоюємо   розряд десятків n змінній b і також відкидаємо його:
a: = n mod 10; n: = n div 10; b: = n mod 10; n: = n div 10;
3) Присвоюємо змінній a число, що представляє собою реверсний запис і зберігається в змінних a і b в другій частині вихідного числа n за вже відомою формулою:
a: = 10 * a + b;
4) Тепер ми можемо використовувати перевірку булевського вираження рівності отриманих чисел n і з допомогою оператора if  організувати виведення відповіді за допомогою розгалужень:
if n = a then writeln ('Yes') else writeln ('No');
  Так як в умові задачі явно не сказано, в якій формі необхідно виводити відповідь, ми будемо вважати логічним вивести її на інтуїтивно зрозумілому користувачеві рівні, доступному в засобах самої мови Pascal. Нагадаємо, що за допомогою оператора write (writeln) можна виводити результат виразу булевського типу, причому при істиності цього виразу буде виведено слово 'TRUE' («true» в пер. з англ. означає «істиний»), при хибності - слово 'FALSE' («false» в пер. з англ. означає «помилковий»). Тоді попередня конструкція з if може бути замінена на writeln (n = a);
program PalindromeNum;
var
n: word;
a, b: byte;
begin
readln(n);
a := n mod 10;
n := n div 10;
b := n mod 10;
n := n div 10;
a := 10 * a + b;
writeln(n = a)
end.

Немає коментарів:

Дописати коментар