Úloha 8: Převod z desítkové soustavy do jiné číselné soustavy
Cíl úlohy
Napište skript, který zadané celé nezáporné číslo z desítkové soustavy (DEC) převede do libovolné číselné soustavy se základem z v rozmezí 2 až 36 (např. binární, osmičková, šestnáctková). Jako cifry pro hodnoty 10 až 35 použijte písmena anglické abecedy A až Z.
Algoritmus dělení základem (MathML)
Převod z desítkové soustavy se provádí postupným celočíselným dělením základem nové soustavy z:
Zbytky r po dělení představují cifry výsledného čísla zapisované v obráceném pořadí (od posledního zbytku k prvnímu).
Úvahy a doporučený postup řešení
- Pole cifer: Připravte si pole symbolů pro jednotlivé zbytky:
$cifry = [0=>'0', '1', ..., '9', 'A', 'B', ..., 'Z'];. - Celočíselný cyklus
while: Dokud je číslo větší než 0:- Spočtěte zbytek po dělení:
$zbytek = $cislo % $z; - Odpovídající cifru přidejte před dosavadní výsledek:
$vysledek = $cifry[$zbytek] . $vysledek; - Číslo celočíselně vydělte základem:
$cislo = intdiv($cislo, $z);(nebofloor($cislo / $z)).
- Spočtěte zbytek po dělení:
- Zvláštní případ pro nulu: Pokud je vstupní číslo rovno nule (
0), výsledkem v libovolné soustavě musí být znak0.
Doplňující otázky k zamyšlení a náměty na rozšíření
- 1. Proč se v počítačích používá binární (základ 2) a hexadecimální (základ 16) soustava? Jak jednoduše převést jedno hexadecimální číslo na čtveřici bitů (nibble)?
- 2. Jaká vestavěná funkce v PHP dokáže převádět mezi soustavami se základy 2 až 36 v jednom řádku? (Prozkoumejte funkci
base_convert()). - 3. Jak byste ošetřili záporné číslo? Jak se záporná čísla kódují v binární paměti procesoru (dvojkový doplněk)?
Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu euler.php