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

Формулювання. 
Дано число типу byte. Перевірити, чи є паліндромом його двійкове подання з урахуванням того, що збережені старші нулі. Приклад таких чисел: 10(2) (бо 10 = 0110(2), а це паліндром), 129 (129 = 1000 0001(2)) і т. д.

Рішення. 
Тут  перевіряється у чисел фіксована розрядність (довжина), адже тут нам уже заданий тип і отримано вказівку зберегти старші нулі, так що в даному випадку двійкові подання  чисел будуть восьмизначними.
Але як же спростити рішення, щоб не робити порівняння всіх розрядів «в лоб»? 
  • Залишок від ділення будь-якого числа x в системі числення з основою p на саме число p дає нам крайній праворуч розряд числа x.
  • Множення будь-якого числа x в системі числення з основою p на саме число p додає числу x новий розряд праворуч.

Для прикладу візьмемо число 158 у десятковій системі числення. Ми можемо отримати його крайню цифру праворуч, яка дорівнює 8, якщо візьмемо залишок від ділення 158 на число 10, що є в даному випадку основою системи числення. З іншого боку, якщо ми помножимо 158 на 10, то з'являється новий розряд праворуч, і в результаті ми отримуємо число 1580.
Згідно з правилом ті ж самі арифметичні закони актуальні і для двійкової системи числення. А це в свою чергу означає, що ми можемо розробити алгоритм для формування числа, що представляє собою праву половину вихідного числа, яка записана в реверсному порядку. Для цього нам потрібно використовувати чотири змінних для зберігання двійкових розрядів правої половини двійковій запису введеного числа, добути ці самі розряди з видаленням їх у вихідному числі, сформувати з них двійковий реверсний запис і виконати порівняння. Позначимо ці змінні типу byte як a, b, c, і d.

program BinaryPalindrome;
var
n, a, b, c, d: byte;
begin
readln(n);
a := n mod 2;
n := n div 2;
b := n mod 2;
n := n div 2;
c := n mod 2;
n := n div 2;
d := n mod 2;
n := n div 2;
a := 8 * a + 4 * b + 2 * c + d;
writeln(n = a)
end.
Виконаємо «ручну прокрутку» програми при введенні числа 102. Покажемо в таблиці, які значення будуть приймати змінні після виконання відповідних рядків (операторів) коду. Значення змінних для наочності представлені як в десятковій, так і в двійковій системі числення (при цьому дописані старші нулі до заповнення тетради). При цьому прочерк означає, що значення змінних на даному етапі не визначене

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

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