program dvojkovy_palindrom;
uses crt;
var n, m, k: integer;
begin
clrscr;
Write('Zadej cislo [0 konci]: ');
readln(n);
while
n > 0
do begin
k := n;
{ * }
m := 0;
{ ** }
while
n > 0
do begin
m := 2*m + (n mod 2);
{ *** }
n := n div 2
{ **** }
end;
Write('Cislo ', k, ' ');
if
k = m
{ ***** }
then begin
Write('je');
end else begin
Write('neni');
end;
Writeln(' dvojkovy palindrom.');
Writeln;
Write('Zadej cislo [0 konci]: ');
readln(n);
end
end.
|
|
|
Zadání:
Opětovně načítejte číslo,
pokud je rovno 0, pak program končí.
Jinak ať program spočítá, jestli je
dvojkový zápis zadaného čísla palindromem.
Palindrom je taková posloupnost znaků,
že čtena odzadu je stejná jako čtena odpředu.
Jinými slovy: je to symetrická posloupnost znaků,
přičemž konkrétní podoba znaků do kriteria nepatří. [Například: kajak]
Řešení:
Opětovného načítání čísel a končení programu
se týkají řádky 7..11 a 30..32 programu.
Algoritmus je postaven na myšlence,
že pokud obrátíme pořadí číslic v libovolném
posičním vyjádření čísla,
pak pokud se nová i stará hodnota takto vyjádřených
čísel rovnají,
potom je ono posiční vyjádření čísla palindromem.
Máme-li hledat dvojkový palindrom, pak vyjadřujeme
číslo ve dvojkové soustavě
a jako zápis ve dvojkové soustavě ho vyhodnocujeme.
* - původní hodnotu (v n) schováme (do k),
protože původní hodnotu při výpočtu budeme měnit.
** - vynulujeme proměnnou m, do které budeme
postupně počítat hodnotu "obráceného" čísla.
*** - "osvobodíme" poslední číslici a pomocí Hornerova schématu,
který vyžaduje číslice
postupně
zepředu, pomocí ní počítáme hodnotu "obráceného" čísla.
**** - "posuneme se" k další číslici doleva.
***** - jsou-li si původní hodnota (v k) a hodnota
"obráceného" čísla (v m) rovna,
pak to je palindrom.
|
|