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