Zmiana bazy liczby.

Odpowiedz Nowy wątek
2011-07-28 10:09
pkh
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 9</sup>1) + (E 92) + (D9</sup>3).
(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 :)

Pozostało 580 znaków

2011-07-31 00:34
msm
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/)

Pozostało 580 znaków

2011-07-31 09:31
bo
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.

Pozostało 580 znaków

2011-08-03 09:49
Zjarek
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).

i o ile dobrze pamiętam z Knutha, to nie da się tego dla ogólnego przypadku zrobić szybciej. - Zjarek 2011-08-05 22:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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