Konwersja między dowolnymi systemami liczbowymi

2012-08-28 21:27

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Witam panowie

mam ciekawy problem i może ktoś mi pomoże zrozumieć i wyjaśni jak go rozwiązać. Sprawa na pierwszy rzut oka wydaje się banalna.
Już spieszę z tłumaczenie.

Pytanie brzmi jak zamienić dowolny system liczbowy na dowolny system liczbowy ?

czyli np jak zamienić system siódemkowy na system dwunastkowy, albo system piątkowy na system trójkowy itp ....
W sieci jest mnóstwo przykładów dotyczących zamiany systemu 2 na 8 i na 16 etc etc ble ble ble .. To mnie nie interesuje
szukam algorytmu na zamianę jednego systemu liczbowego na inny i nie chodzi mi o system 10 .

Ogólnie użytkownik podaje dane czyli liczbę dowolną i podaje w jakim ona jest systemie i na jaki system ma być zamieniona ot co ?

Jest na to jakiś algorytm czy się muszę głowić ?
I proszę nie przedstawiajcie przykładów jak zamieniać dwójkowy na ósemkowe etc bo tego się naczytałem w sieci . Teoretycznie czytałem też o schemacie hornera ale to jest algorytm pozwalający zwiększyć szybkość wykonania konwersji z dowolnego systemu na dziesiątkowy ... .

edytowany 1x, ostatnio: brudy, 2012-08-28 21:29

Pozostało 580 znaków

2012-08-28 21:33

Rejestracja: 9 lat temu

Ostatnio: 6 lat temu

0

Zamieniasz z siódemkowego na dziesiętny i potem z dziesiętnego na dwunastkowy?


Idiots, idiots everywhere.

Pozostało 580 znaków

msm
2012-08-28 21:36
msm
Administrator

Rejestracja: 11 lat temu

Ostatnio: 3 dni temu

1

Najpierw musisz wczytać liczbę od użytkownika. Użytkownik podaje string, nie liczbę. Liczba, sama w sobie, jest niezależna od tego w jakim systemie jest zapisana. Czyli robisz:

liczba wczytaj(string, base):
    liczba wynik = 0
    for i = 0; i < string.size; i++:
        wynik = base * wynik + get_digit(string[i], base)
    return wynik

Ok, teraz masz już liczbę. Pozostaje ją wypisać w wymaganym systemie (tak, to wypisuje znaki w odwrotnej kolejności - odwrócić można np. tablicą):

void print(liczba, base):
    while liczba > 0:
        print_char liczba % base
        liczba = liczba / base

I... tyle.

W sieci jest mnóstwo przykładów dotyczących zamiany systemu 2 na 8 i na 16 etc etc ble ble ble .. To mnie nie interesuje
Gdybyś zrozumiał co tam się dzieje, nie miałbyś problemu z napisaniem własnej konwersji...

czytałem też o schemacie hornera ale to jest algorytm pozwalający zwiększyć szybkość wykonania konwersji z dowolnego systemu na dziesiątkowy
Ciekawa definicja, szkoda że zupełnie błędna...

edytowany 7x, ostatnio: msm, 2012-08-28 21:55

Pozostało 580 znaków

2012-08-28 21:38

Rejestracja: 15 lat temu

Ostatnio: 31 minut temu

1

Najpierw schematem Hornera zamieniasz ciąg na liczbę, np mamy system siódemkowy i ciąg 3, 2, 5, 0 - ze schematu Hornera dostajemy ((((3) 7 + 2) 7 + 5) * 7 + 0) = 1162
Potem dzielisz aż dostaniesz zero i spisujesz reszty w kolejności odwrotnej, czyli:
1162 / 12 = 96 r 10
96 / 12 = 8 r 0
8 / 12 = 0 r 8
wynik = 80A (zakładając, że A to cyfra 10, a B to cyfra 11, analogicznie jak w hexach)

edit:
no i znowu za późno. idę do sklepu, bo się spóźnię.

ps:
pamiętaj o rozróżnieniu dwóch rzeczy:

  1. ciąg cyfr w jakiejś tam podstawie
  2. liczba (której reprezentacja cię nie interesuje)

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 3x, ostatnio: Wibowit, 2012-08-28 21:41

Pozostało 580 znaków

Rev
2012-08-28 21:42
Rev
Moderator

Rejestracja: 13 lat temu

Ostatnio: 3 tygodnie temu

2012-08-28 21:53

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

No tak ale to jest tak na okrętke trochę nie sądzicie najpierw zamienić na liczbę w systemie(10) a potem skonwertować na inną.

Nie ma bezpośredniej drogi ???

edytowany 1x, ostatnio: brudy, 2012-08-28 21:57

Pozostało 580 znaków

msm
2012-08-28 21:57
msm
Administrator

Rejestracja: 11 lat temu

Ostatnio: 3 dni temu

0
brudy napisał(a):

No tak ale to jest tak na okrętke trochę nie sądzicie najpierw zamienić na liczbę (10) a potem skonwertować na inną.

Nie ma bezpośredniej drogi ???

To jest bezpośrednia droga.

Liczby w komputerze na których operujesz nie mają systemu, nie konwertujesz w żaden sposób napisu na liczbę (10).

Myślisz błędnie o napisie (ciąg znaków) jak o liczbie - napisanie funkcji konwertującej napis w dowolnym systemie liczbowym na napis w innym systemie liczbowym dopiero byłoby drogą na około (i wymyślaniem koła od nowa).

edytowany 6x, ostatnio: msm, 2012-08-28 21:59
technicznie to liczba jest konwertowana na system binarny i z niego zamiana na inny... - dawidgarus 2012-08-28 22:01
ale to że liczby są /wewnętrznie/ reprezentowane binarnie nie ma znaczenia z punktu widzenia języka programowania. System liczbowy to tylko i wyłączne sposób na zapisanie liczby, nie jej cecha. - msm 2012-08-28 22:06

Pozostało 580 znaków

2012-08-28 22:02

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0
brudy napisał(a):

No tak ale to jest tak na okrętke trochę nie sądzicie najpierw zamienić na liczbę w systemie(10) a potem skonwertować na inną.

Nie ma bezpośredniej drogi ???

Najpierw musisz wczytać liczbę od użytkownika. Użytkownik podaje string, nie liczbę. Liczba, sama w sobie, jest niezależna od tego w jakim systemie jest zapisana. Czyli robisz:

of usera dostaję 3 parametry

  1. number - podana liczba oddzielona np. umownym znakiem powiedzmy - bo np mając system "trzydziestko-wo-dwójkowy" możemy mieć tak 12_31_23 czyli musi być string
  2. w jakim systemie jest ta liczba przekazana czyli np w moim przypadku 32
  3. w jakim systemie ma być skonwertowana , powiedzmy osiemnastko wym

Wibowicie napisałeś :

Najpierw schematem Hornera zamieniasz ciąg na liczbę

ale liczba w naszym zadaniu jest pojęciem względnym , w ludzkim doslownym języku jeśli ktoś mówi o liczbie ma na myśli liczbę w postaci 10 . a my tu mówiąc o liczbie musimy podać także w jakim jest ona systemie .

Algorytmy które podajecie rozumiem i wiem jak działają , chodzi mi tylko o bezpośrednią zamianę . Rozumiecie o co mi chodzi ???

edytowany 2x, ostatnio: brudy, 2012-08-28 22:13
ja nie rozumiem, co Ty chcesz powiedzieć. - allocer 2012-08-28 22:04
no chodzi mi o to, że mamy podaną liczbę i wiemy w jakim jest ona systemie to chodzi mi o to jak ją skonwertować bez pośredniej konwersji na system 10 ?? przecież jak zamieniamy system dwójkowy na ósemkowy to nie zamieniamy najpierw dwójkowego na dziesiętny a potem dziesiętny na ósemkowy tylko robimy to bezpośrednio .... Więc ja się pytam czy jest ogólny algorytm na zamianę jednego systemu na inny - brudy 2012-08-28 22:09
jeśli chciałbyś zamienić liczbę z systemu siódemkowego na trójkowy, to musiałbyś siódemkową liczbę dzielić z resztą przez siódemkową reprezentacje liczby 3(10). Żeby z kolei tą wyliczyć musiałbyś zamienić liczbę 3 z dziesiątkowego na siódemkowy. c**** i ciężkie do pojęcia rozwiązanie. Nawet nie wiem czy ja się gdzieś nie walnąłem. @edit. teraz może jest poprawnie, zamieszało mi to w głowie - Sopelek 2012-08-28 22:18
No właśnie panie Sopelek o coś takiego mi chodzi w sumie jest w tym jakiś sens, teraz ja muszę sobie to poukładać :) - brudy 2012-08-28 22:48

Pozostało 580 znaków

2012-08-28 22:59

Rejestracja: 15 lat temu

Ostatnio: 31 minut temu

0

Możesz dzielić pisemnie. 12 w systemie siódemkowym to 15. A więc:

  165
 -----
 3250 : 15
-15
 --
 145
-132
  ---
  130
 -114
  ---
   13

13 w systemie siódemkowym to A w systemie dwunastkowym.

No to jedziemy dalej:

  11
 ---
 165 : 15
-15
 --
  15
 -15
 ---
  ==

0 w systemie siódemkowym to 0 w systemie dwunastkowym. No i na koniec oczywiste:

  0
 --
 11 : 15
- 0
 --
 11

11 w systemie siódemkowym to 8 w systemie dwunastkowym.

Składając reszty w odwrotnej kolejności dostajemy 80A czyli to co powinniśmy dostać.

Jest to algorytm bezpośredni, ale moim zdaniem dużo wolniejszy niż algortym 'pośredni', na który autor tematu narzeka.

Innym sposobem mogłoby być stablicowanie, tzn np tablicujemy liczby siódemkowe: 1, 2, ... 6, 10, 20, ... 60, 100, 200, ... 600, itd tzn ich reprezentację dwunastkową, a następnie mapujemy cyfry wejściowe na te reprezentacje dwunastkowe i je dodajemy w słupku. To mogłoby być szybsze jeśli nie liczyć złożoności tablicowania. To dodawanie, mapowanie i tablicowanie można dodatkowo zrównoleglić.

Teoretycznie czytałem też o schemacie hornera ale to jest algorytm pozwalający zwiększyć szybkość wykonania konwersji z dowolnego systemu na dziesiątkowy ... .

Ale dlaczego dziesiątkowy? Co ma takiego system dziesiątkowy, że algorytmy bez niego nie działają?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 4x, ostatnio: Wibowit, 2012-08-28 23:07
Że Ci się chce tak rozpisywać... Tak naprawdę ten algorytm wykonuje te same operacje co 'normalny', tylko że jest trudniejszy do napisania ;] - msm 2012-08-28 23:21

Pozostało 580 znaków

2012-08-29 02:34
Moderator

Rejestracja: 12 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Wrocław

0

Wątek powinien wylecieć do kosza za temat, ale że jest dużo merytorycznych odpowiedzi, to tylko temat zmieniłem.
Następnym razem za zły temat będzie 50zł mandatu.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2014-02-02 02:11

Rejestracja: 6 lat temu

Ostatnio: 6 lat temu

0

Tak dla zainteresowanych na przyszłość. Prosta metoda - i prosta implementacja na dowolny język programowania.

Dla liczby całkowitej:

  • dzielimy liczbę przez podstawę nowego systemu i odpisujemy resztę z tego dzielenia (to kolejne cyfry w liczbie w nowym systemie), a z całkowitym wynikiem dzielenia postępujesz tak samo (rekurencyjnie)

Dla liczby ułamkowej

  • mnożymy część ułamkową liczby przez podstawę nowego systemu i odpisujemy od wyniku część całkowitą (to kolejne cyfry po przecinku w liczbie ułamkowej w nowym systemie), a z pozostałą częścią ułamkową postępujesz tak samo (rekurencyjnie)

Można sobie przeliczać na stronce www on line - z różnych systemów na inne, dowolne liczby:

http://systemyliczbowe.urfu.pl

Pozostało 580 znaków

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