NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Algoritmus pro převod mezi libovolnými soustavami

V minulé lekci, Eratosthenovo síto, jsme si ukázali algoritmus, který najde všechna prvočísla v intervalu od 2 do N.

Jednoduchý algoritmus pro převod mezi libovolnými číselnými soustavami využívající Hornerovo schéma včetně zdrojových kódů v C# .NET.

private string ConvertToBase(int numberOfBase, int value)
{
    Stack<char> result = new Stack<char>();

    while (value > 0)
    {
        int rest = value % numberOfBase;
        result.Push(rest > 9 ? Convert.ToChar(rest + 55) : rest.ToString()[0]);
        value = (value - rest) / numberOfBase;
    }

    return new string(result.ToArray());
}

private int ConvertFromBase(int numberOfBase, string value)
{
    int result = 0;

    foreach (char rough in value.Substring(0, value.Length - 1))
        result = (result + GetNumber(rough)) * numberOfBase;

    return result + GetNumber(value[value.Length - 1]);
}

private int GetNumber(char val)
{
    try
    {
        return int.Parse(val.ToString());
    }
    catch
    {
        return (int)val - 55;
    }
}

Převod do zadané soustavy probíhá nejznámějším způsobem - odeberu ze základního čísla celočíselný zbytek po dělení zvolenou soustavou a zapíši jej. Zmenšené základní číslo vydělím (nyní již beze zbytku) zvolenou soustavou a takto pokračuji, dokud mi nezbude ze základního čísla 0. Navíc zde využívám zásobník, takže výsledek nemusím převracet - nýbrž jen postavím string z pole znaků.

Převod ze soustavy je o něco zajímavější - jelikož využívám Hornerova schématu. Bohužel nevím, jak to efektivně popsat - prostě Hornerovo schéma vypadá právě tak - čili:

An = čísloSoustavy * ( A(n + 1) + čísloSoustavy * (...

Pro začátečníky:

Convert.ToChar je metoda, jejíž prametr může být ASCII pořadí znaku - toho zde využívám. V ASCII začíná latinská abeceda až od 64. znaku. Proto musím k maximálnímu číslu desítkové soustavy - 9 - přičíst ještě 55. 55 + 9 = 64... A naopak char se dá překonvertovat do ASCII pořadí... Toho využívám zde: (int)val a odečtu zase oněch 55...


 

Předchozí článek
Eratosthenovo síto
Všechny články v sekci
Matematické algoritmy
Článek pro vás napsal matesax
Avatar
Uživatelské hodnocení:
1 hlasů
Aktivity