Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 30 + hiring

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ů.

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:12.12.2012 11:41

Nechtěl bys algoritmus nějak více popsat? Jak postupuje, co která část dělá a tak podobně?

Odpovědět
12.12.2012 11:41
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka
matesax:13.12.2012 14:13

Omlouvám se, nyní je můj notebook v opravě, takže nemohu reagovat flexibilně. Přišlo mi to jasné, ale dobrá - přidám komentáře...

 
Odpovědět
13.12.2012 14:13
Avatar
Michael Olšavský:2.1.2013 21:40

Jen takové vylepšení pro začátečníky: mohl by si místo převádění na znaky a přičítání hodnoty pro získání čísla vytvořit pole[1-9]. Myslím, že by to lépe pochopili. Ale není to špatné.

 
Odpovědět
2.1.2013 21:40
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michael Olšavský
Kit:2.1.2013 21:46

Místo pole by to chtělo spíš string "0123456789AB­C...Z".

Odpovědět
2.1.2013 21:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Michael Olšavský
matesax:2.1.2013 21:48

Přeci mi nebudeš tvrdit, že je efektivnější vypisovat se se všemi znaky... Proto je to algoritmus pro převod mezi libovolnou soustavou... :) Spíše přidám lepší komenty...

Editováno 2.1.2013 21:51
 
Odpovědět
2.1.2013 21:48
Avatar
Odpovídá na Kit
Michael Olšavský:2.1.2013 21:49

Jojo. Pravda. Promiň nějak mi nedošlo že to de převést i do soustav s písmeny (hexadecimální). Díky za opravu

 
Odpovědět
2.1.2013 21:49
Avatar
Odpovídá na matesax
Michael Olšavský:2.1.2013 21:50

Tak k tomu alespoň dopiš ty komentáře.

 
Odpovědět
2.1.2013 21:50
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:2.1.2013 22:01

Ano, je efektivnější, když to budeš vybírat ze stringu. Dokonce i naopak.

Odpovědět
2.1.2013 22:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.