Завдання № 11. Перевірити, чи є двійкове подання числа паліндромом » Pascal - основи програмування

Основи програмування на мові Pascal

 

Спонсори

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

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

Формулювання. Дано число типу byte. Перевірити, чи є паліндромом його двійкове подання з урахуванням того, що збережені старші нулі. Приклад таких чисел: 102 (т. К. 102 = 0110 01102, а це паліндром), 129 (129 = 1000 00012) і т. Д.
Рішення. Дане завдання частково повторює завдання 9. Подібність полягає в тому, що і там, і тут у перевіряються чисел фіксована розрядність (довжина), адже тут нам уже заданий тип і отримано вказівку зберегти старші нулі, так що в даному випадку двійкові подання всіх подаються на вхід програмою чисел будуть восьмизначними.
Але як же спростити рішення, щоб не робити порівняння всіх розрядів «в лоб»? Для цього нам потрібно згадати правило, згадане в задачі 5, цього разу кілька уточнене і доповнене:

  • Залишок від ділення будь-якого числа x в системі числення з основою p на саме число p дає нам крайній праворуч розряд числа x.
  • Множення будь-якого числа x в системі числення з основою p на саме число p додає числу x новий розряд праворуч.

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

 

    Опишемо сам алгоритм:
1) Вводимо число n;
2) Послідовно отримуємо 4 крайніх праворуч розряду двійковій запису числа 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;

3) Тепер потрібно подумати, як видозміниться формула, за допомогою якої ми отримували реверсну запис числа в задачі 4 і завданню 9. Очевидно, що в десятковій системі числення реверсну запис чотиризначного числа, розряд одиниць якого знаходиться в змінній k, розряд десятків - у змінній l, сотень - у m і тисяч - в n ми можемо знайти за такою формулою (x в даній випадку - будь-яка змінна типу word):

x := 1000 * k + 100 * l + 10 * m + n;

    Можна уявити, що ми формуємо чотири числа, які потім складаємо. Перше число 1000 * k - це розряд одиниць вихідного числа, до якого справа приписано три розряди (три нуля), тобто, тричі вироблено множення на основу системи числення 10, простіше кажучи, число k помножено на 103. Аналогічно, до l потрібно приписати два нуля, до m - один нуль, а n залишити без зміни, так як ця цифра буде знаходитися в розряді одиниць формованого «перевертиша». Згадавши правило, висловлене трохи вище, перетворимо попередню формулу для двійкової системи числення (будемо множити цифри на двійку у відповідних ступенях). Вона вийде такий (для формування числа використовується змінна a):

a := 8 * a + 4 * b + 2 * c + d;

4)После применения вышеприведенной строки останется лишь вывести на экран результат сравнения полученных чисел:

writeln(n = a);

Код:


  1. program BinaryPalindrome;
  2. var
  3. n, a, b, c, d: byte;
  4. begin
  5. readln(n);
  6. a := n mod 2;
  7. n := n div 2;
  8. b := n mod 2;
  9. n := n div 2;
  10. c := n mod 2;
  11. n := n div 2;
  12. d := n mod 2;
  13. n := n div 2;
  14. a := 8 * a + 4 * b + 2 * c + d;
  15. writeln(n = a)
  16. end.

   

    Виконаємо «ручну прокрутку» програми при введенні числа 102. Покажемо в таблиці, які значення будуть приймати змінні після виконання відповідних рядків (операторів) коду. Значення змінних для наочності представлені як в десятковій, так і в двійковій системі числення (при цьому дописані старші нулі до заповнення тетради). При цьому прочерк означає, що значення змінних на даному етапі не визначене, а червоним кольором виділені змінні, які змінюються:

 рядка

Десяткова система

Двійкова система

n

a

b

c

d

n

a

b

c

d

7

102

0110 0110

8

102

0

0110 0110

0000

9

51

0

0011 0011

0000

10

51

0

1

0011 0011

0000

0001

11

25

0

1

0001 1001

0000

0001

12

25

0

1

1

0001 1001

0000

0001

0001

13

12

0

1

1

0000 1100

0000

0001

0001

14

12

0

1

1

0

0000 1100

0000

0001

0001

0000

15

6

0

1

1

0

0000 0110

0000

0001

0001

0000

16

6

6

1

1

0

0000 0110

0110

0001

0001

0000

 

zavdannya-11.rar [512 b] (cкачувань: 11)

скачать dle 10.4фильмы бесплатно Попередня сторінка » Завдання № 10. Перевірити, чи є чотириз...