Úloha 8: Převod z desítkové soustavy do jiné číselné soustavy

Mírně pokročilý cyklus while modulo (%) číselné soustavy MathML

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:

N=q⋅z+r kde r=Nmodz (0≤r<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:
    1. Spočtěte zbytek po dělení: $zbytek = $cislo % $z;
    2. Odpovídající cifru přidejte před dosavadní výsledek: $vysledek = $cifry[$zbytek] . $vysledek;
    3. Číslo celočíselně vydělte základem: $cislo = intdiv($cislo, $z); (nebo floor($cislo / $z)).
  • Zvláštní případ pro nulu: Pokud je vstupní číslo rovno nule (0), výsledkem v libovolné soustavě musí být znak 0.

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