Patrzyłem na matematykę dotyczącą konwersji z dowolnej bazy na dowolną bazę. Chodzi bardziej o potwierdzenie moich wyników niż cokolwiek innego. Znalazłem moją odpowiedź na mathforum.org, ale nadal nie jestem pewien, czy mam rację. Mam konwersję z większej bazy na mniejszą bazę w porządku, ponieważ jest to po prostu pierwsza cyfra pomnożona przez bazę, którą chcesz dodać kolejną cyfrę. Mój problem pojawia się podczas konwersji z mniejszej bazy na większą. Robiąc to, rozmawiają o tym, jak trzeba przekonwertować większą bazę, którą chcesz, na mniejszą. Przykładem może być przejście z bazy 4 na bazę 6, w której musisz przekonwertować liczbę 6 na bazę 4, uzyskując 12. Następnie robisz to samo, co podczas konwersji z dużej na małą. Trudność z tym jest taka, że wydaje się, że musisz wiedzieć, co jest jedną liczbą w drugiej bazie. Chciałbym więc wiedzieć, co to jest 6 w bazie 4. Stwarza to duży problem w mojej głowie, ponieważ wtedy potrzebowałbym stołu. Czy ktoś wie, jak to zrobić w lepszy sposób?
Myślałem, że podstawowa konwersja pomoże, ale nie mogę znaleźć żadnej takiej pracy. I ze strony, którą znalazłem, wydaje się, że pozwala ci na konwersję z bazy na bazę bez przechodzenia przez bazę 10, ale najpierw musisz wiedzieć, jak przekonwertować pierwszą liczbę z bazy na bazę. To sprawia, że jest to trochę bezcelowe.
Komentatorzy mówią, że muszę być w stanie przekonwertować literę na liczbę. Jeśli tak, to już to wiem. To jednak nie mój problem. Mój problem polega na przekonwertowaniu dużej bazy na małą bazę. Najpierw muszę przekonwertować numer bazy, który mam, na numer bazy, który chcę. Robiąc to, pokonałem cel, ponieważ jeśli mam możliwość konwersji tych baz na inne, już rozwiązałem swój problem.
Edycja: Zorientowałem się, jak przekonwertować z baz mniejszych lub równych 10 na inne bazy mniejsze lub równe 10. Mogę również przejść z bazy większej niż 10 na dowolną bazę, która ma 10 lub mniej. Problem zaczyna się, gdy konwertujesz z podstawy większej niż 10 na inną bazę większą niż 10. Lub przechodząc z bazy mniejszej niż 10 do bazy większej niż 10. Nie potrzebuję kodu, potrzebuję tylko podstawowej matematyki, która może być zastosowane do kodu.
źródło
string
a zwraca anint
), oraz algorytmu, który przyjmuje liczbę i zwraca jej reprezentację w danej bazie.Odpowiedzi:
Wydaje mi się to bardzo podstawowym pytaniem, więc przepraszam, jeśli trochę was nauczę. Najważniejszą rzeczą, którą musisz się tutaj nauczyć, jest to, że liczba nie jest jej cyfrową reprezentacją . Liczba jest abstrakcyjnym obiektem matematycznym, podczas gdy jej cyfrowa reprezentacja jest czymś konkretnym, mianowicie sekwencją symboli na papierze (lub sekwencją bitów w pamięci obliczeniowej lub sekwencją dźwięków, które wydajesz, gdy podajesz liczbę). Mylące jest to, że nigdy nie widzisz liczby, ale zawsze jej cyfrowa reprezentacja. W rezultacie myślisz, że liczba jest reprezentacją.
Dlatego poprawnym pytaniem jest nie „jak przekonwertować z jednej bazy na drugą”, ale „jak dowiedzieć się, która liczba jest reprezentowana przez dany ciąg cyfr” i „jak znaleźć cyfrową reprezentację podany numer ”.
Stwórzmy więc dwie funkcje w Pythonie, jedną do konwersji cyfrowej reprezentacji na liczbę, a drugą do odwrotnego działania. Uwaga: kiedy uruchomimy funkcję, Python wydrukuje oczywiście na ekranie liczbę, którą otrzymał w bazie 10. Ale to nie znaczy, że komputer zachowuje liczby w bazie 10 (nie jest). Nie ma znaczenia, w jaki sposób komputer reprezentuje liczby.
Przetestujmy te:
Uzbrojony w funkcje konwersji problem można łatwo rozwiązać:
Test:
Uwaga: my nie przechodzą przez podstawę 10 reprezentacji! Przekształciliśmy bazę na liczbę, a następnie liczbę na bazę c . Numer byłb do nie reprezentowany. (Właściwie tak było, komputer musiał jakoś to reprezentować, i reprezentował to za pomocą sygnałów elektrycznych i funky, które zdarzają się w układach scalonych, ale z pewnością nie były to 0 i 1).
źródło
fromDigits
zwraca liczbę w podstawie 10.Myślę, że najlepszym sposobem na zrozumienie tego jest dyskusja z kosmitą (przynajmniej analogicznie).
Definicja jest liczbą w bazie b, cox b oznacza, że jest ciągiem cyfr < bx < b .
Przykłady Ciąg cyfr 10010011011 jest liczbą w podstawie 2, ciąg 68416841531 jest liczbą w podstawie 10, BADCAFE jest liczbą w podstawie 16.
Załóżmy teraz Dorastałem na planecie QUUX gdzie każdy uczy się pracy w przez całe swoje życie, a ja cię poznać, który jest stosowany do podstawowego bq b . Więc pokaż mi numer i co mam zrobić? Potrzebuję sposobu, aby to zinterpretować:
Definicja Mogę zinterpretować liczbę w podstawie (Uwaga: b jest liczbą w podstawie q ) według następującego wzorub b q
gdzie oznacza ciąg pusty, a ˉ s d oznacza ciąg kończący się w cyfrowym d . Zobacz mój dowód, że dodatek stanowi wprowadzenie do tej notacji.ϵ s¯re re
Co się tu stało? Podałeś mi liczbę w podstawie a ja zinterpretowałem ją w podstawie q bez jakiejkolwiek dziwnej filozofii na temat tego, jakie naprawdę są liczby.b q
Klucz Kluczem do tego jest to, że i + I są funkcjami, które działają na bazowychliczbach q . Są to proste algorytmy zdefiniowane rekurencyjnie na podstawie q liczb (ciągów cyfr).× + q q
Może się to wydawać nieco abstrakcyjne, ponieważ przez cały czas używałem zmiennych, a nie liczb rzeczywistych. Załóżmy więc, że jesteś stworzeniem podstawowym 13 (używając symboli ), a ja jestem przyzwyczajony do bazy 7 (co jest znacznie bardziej rozsądne), używając symboli α β γ δ ρ ζ ξ .0123456789 XYZ α βγδρ ζξ
Widziałem twój alfabet i zestawiłem go tak:
Zacznę od pomnożeniaβζ× βξ
Tabela mnożenia Quuxa
więc mam tak daleko
Teraz muszę wykonać dodawanie za pomocą algorytmu, o którym była mowa wcześniej:
więc
źródło
To tylko refaktoryzacja (Python 3) Andreja kodu . W kodzie Andreja liczby są reprezentowane przez listę cyfr (skalary), natomiast w poniższym kodzie numery są reprezentowane przez listę symboli pobranych z niestandardowego ciągu :
Aby wykonać konwersję wartości do reprezentacji w bazie niestandardowej:
Aby wykonać konwersję z reprezentacji (w niestandardowej bazie) na wartość:
Aby wykonać konwersję bazy z jednej bazy klienta do innej:
źródło
Podstawową operacją konwersji podstawowej jest
toDigits()
operacja odpowiedzi @AndrejBauer. Jednak aby to zrobić, nie ma potrzeby tworzenia liczby w wewnętrznej reprezentacji liczb, co jest w zasadzie konwersją zi do reprezentacji 2 bazowej. Możesz wykonać niezbędne operacje w oryginalnej reprezentacji bazowej.Pierwszym krokiem jest wykonanie powtarzalnej operacji dzielenia modulo
Ponieważ wewnętrzną reprezentacją są cyfry, należy wykonać specjalną funkcję do testowania zera
W końcu należy wykonać operację modulo_div, która jest tak naprawdę standardowym podziałem według bazy docelowej, jak uczyliśmy się w szkole.
tylko test sprawdzający, czy kod jest poprawny:
źródło
Znam prosty sposób na konwersję podstawową, która nie wymaga programu komputerowego. Jest to poprzez zdefiniowanie sposobu konwersji z dowolnej bazy na bazę 2 i odwrotnie, a następnie pokrycie z jednej bazy na inną bazę poprzez najpierw konwersję z pierwszej bazy na bazę 2, a następnie konwersję z bazy 2 na drugą bazę. 2 jest bardzo łatwy do pomnożenia lub podzielenia przez dowolną bazę.
Aby przekonwertować z dowolnej bazy na bazę 2, wystarczy, że rozpoznasz to dla dowolnej liczby, jeśli weźmiesz jej notację podstawy 2 i zaczniesz od 0, a następnie dla każdej cyfry w kolejności od lewej do prawej podwójnie, jeśli cyfra jest równa zero i podwójnie niż dodaj 1, jeśli ta cyfra to 1, dostaniesz się do tej liczby. Biorąc pod uwagę tę liczbę w dowolnej bazie, możesz podzielić przez 2 w tej bazie, aby otrzymać iloraz i resztę. Jeśli reszta to 1, ostatnia cyfra binarna to 1, a jeśli reszta to 0, ostatnia cyfra binarna to 0. Ponownie podziel przez 2. Jeśli reszta to 1, druga ostatnia cyfra to 1, a jeśli reszta to 0, druga ostatnia cyfra to 0 i tak dalej, aż otrzymasz iloraz 0.
Aby przekonwertować z bazy 2 na dowolną bazę, wszystko co musisz zrobić, to w tej bazie rozpocząć od 0, a następnie dla każdej cyfry binarnej przechodzącej od lewej do prawej, podwój w tej bazie, jeśli ta cyfra to 0, a następnie dodaj 1 w tej podstawa, jeśli cyfra to 1.
źródło
2 is so easy to multiply or divide by in any base.
Nie widzę tego w przypadku baz nieparzystych, które są więcej niż jedną z dowolnej potęgi dwóch (na początek 11 i 13).Możesz dokonać konwersji z bazy n na bazę 10 bez jakiejkolwiek konwersji na jakąś bazę pośrednią.
Aby na przykład przekonwertować bazę n na bazę 9, weź algorytm konwersji na bazę 10 i zamień „10” na „9”. To samo dla każdej innej bazy.
źródło