Zmiana bazy liczby.

0

Witam
W ramach dokształcania informatycznego, rozwiązuje sobie różne problemy i natrafiłem na jeden który nie daje mi spokoju. Moim zadaniem jest przekształcić liczbę zapisaną w dowolnej bazie do innej.
Potrafię sobie na kartce papieru bez problemu to napisać, nie wiem jednak czy jest to metoda dobra bo widzę parę problemów i nie wiem co z nimi zrobić.

Najpierw przykład. Ja np. mam alfabet "ABCDEFG..." i tak dalej. I teraz w nim mam zapisaną liczbę "DEAD" w powiedzmy systemie 9 to jest ona równa:

DEAD = (D * 90) + (A * 91) + (E * 92) + (D*93).
(Gdzie D = 3, A = 0, E = 4)

Otrzymam tym sposobem liczbę w formacie dziesiętnym i teraz przerobienie jej nie będzie stanowiło dla mnie większego problemu.
Problem jest jednak w tym że podstawa może być duża. Np. 60 i wtedy liczba którą otrzymam może być stanowcza za duża za zakres zmiennych w C/C++. I nie wiem co z tym zrobić.

Widzę parę rozwiązań nie wiem jednak które jest lepsze. Czy zamiast trzymać liczbę w formacie jakiegoś long int(który jest de facto mały, dla tego problemu) zrobić porostu tablicę np. char w której pod postacią ciągu znaków będę trzymał liczbę czy zamiast przerabiania do dziesiętnego systemu od razu zapisywać to w docelowym formacie? Wydaje mi się że wystarczyło by zamiast tej ( 9^n ) dać tam liczbę w odpowiednim formacie i zaimplementować odpowiednie dodawanie i mnożenie. Nie wiem jednak czy to wszystko jest dobre, i czy nie jest jakaś lepsza metoda na która nie mogę wpaść (ani znaleźć w internecie).

Przepraszam za wypracowanie, ale musiałem sobie jakoś to poukładać w głowie :)
Z góry dziękuje za wszystkie wskazówki :)

0

Chyba faktycznie najprościej będzie liczyć na Dużych Liczbach (naprawdę planujesz używać aż takich dużych liczb które nie mieszczą się w zakresie C++?). Możesz to implementować samemu albo użyć jakiejś biblioteki typu BigInt (http://sourceforge.net/projects/cpp-bigint/)

0

Imho, przechowywanie liczb w pamięci komputera jest proste. Dla przechowania liczby o podstawie b użyłbym wektora liczb typu int, którego każdy element byłby "cyfrą" liczby, tzn. liczbą z zakresu [0; b-1]. Trudniejsze są operacje wejścia/wyjścia. Jak wprowadzić do programu liczbę o podstawie 157? Jak wypisać liczbę o podstawie 403? Jedna z możliwości wypisywania, to użycie opisanej wcześniej wewnętrznej reprezentacji. 90010 = 2*403 + 94. Zatem wypisujemy (w układzie o podstawie 403) 002094. Sposób jest uniwersalny, niestety jest raczej nieoszczędny i zupełnie niezgodny z przyjętą konwencją dla podstawy 16.

0

Ogólnie to ja bym tylko dodał, że zamianę bazy szybko robi się poprzez mnożenie po kolei, dla podanego przykładu ((((D)*90+A)*90+E)*90+D).

1 użytkowników online, w tym zalogowanych: 0, gości: 1