Dzielenie dużych liczb, większych niż mieści Int64.

0

Witam ma problem z którym nie wiem jak sobie poradzić. Mianowice potrzebuje podzielić liczby większe niż przyjmuje Int64. Można to zrobić sposobem pisemnym wiem, ale tylko w wypadku gdy dzielnik (dzielna / dzielnik) nie jest większa niż może przyjąć Int64. Może zna ktoś inny sposób jak dzielić tak duże liczby?. Jakiś algorytm, cokolwiek. Bo utknąłem w miejscu ;/.

Będę wdzięczny za pomoc :).

Pozdrawiam :)

2

Zaimplementować to w sposób jaki robisz to ręcznie na kartce. Lub użyć odpowiedniej biblioteki których jest na pęczki wystarczy poszukać.

0
_13th_Dragon napisał(a):

Zaimplementować to w sposób jaki robisz to ręcznie na kartce.

Pisemnie mogę dzielić ale jeżeli dzielnik jest większy niż może przyjąć int64 to pisemne dzielenie odpada. chyba że jest jakiś inny sposób pisemnego dzielenia niż ja znam.

_13th_Dragon napisał(a):

Lub użyć odpowiedniej biblioteki których jest na pęczki wystarczy poszukać.

Zależało by mi żeby samemu coś takiego napisał, ale nie mogę znaleźć żadnej wskazówki jak się za to zabrać.

Pozdrawiam :)

7
Orawlfc napisał(a):

Pisemnie mogę dzielić ale jeżeli dzielnik jest większy niż może przyjąć int64 to pisemne dzielenie odpada.
Założę się że, kiedy uczono cie pisemnego dzielenia to nic a nic nie wiedziałeś o int64 i to ci w żaden sposób nie przeszkadzało.

0

ale jeżeli dzielnik jest większy niż może przyjąć int64 to pisemne dzielenie odpada

Nieprawda.
Musiałbyś jedynie zaimplementować 4 podstawowe działania, tj.dodawanie, odejmowanie, mnożenie i dzielenie dla dowolnie dużych liczb, a wtedy jedynym ograniczeniem jest rozmiar pamięci*.
* jeżeli chcemy być precyzyjni, to dochodzi jeszcze drugie ograniczenie: maksymalny rozmiar tablicy/maksymalna wartość iteratora tablicy (compiler-dependent).

0
Patryk27 napisał(a):

Nieprawda.
Musiałbyś jedynie zaimplementować 4 podstawowe działania, tj.dodawanie, odejmowanie, mnożenie i dzielenie dla dowolnie dużych liczb, a wtedy jedynym ograniczeniem jest rozmiar pamięci.

Dodawanie, odejmowanie, mnożenie zaimplementowałem sposobem pisemny. Ale z dzieleniem nie jest już tak łatwo. Jeśli mamy 660/20 to pierwszym krokiem jest 66 div 20. Ale co jeżeli dzielnik czyli w w/w. przykładzie 20, przekracza możliwości int64?

0

Zacząłbym od znalezienia NWD obu liczb i podzielenia obu przez tę wartość, a dopiero potem 'rzeczywistego' ich dzielenia - ale zapewne są jakieś lepsze metody, które jedynie w tej chwili nie chcą mi przyjść na myśl :P

0

Ok, dzięki jest to jakiś pomysł. :). Sam nic innego nie mogę wymyślić więc spróbuje tak :). Jak komuś wpadnie jeszcze jakiś inny pomysł do głowy to niech się nim podzieli. Dzięki, pozdrawiam :).

0

http://en.wikipedia.org/wiki/Division_%28digital%29
tu masz zdaje się parę innych pomysłów
masz tam nawet dział "Large integer methods"

0

div też masz zaimplementować samodzielnie przez dodawanie

Nie mogłeś tak od razu, teraz to wszystko jasne i proste.

Wielkie dzięki !!

0

Zakładając, że masz szybki algorytm mnożenia to możesz zrobić coś w stylu wyszukiwania binarnego:

low := 0
high := dividend
while low != high:
  mid = (low + high + 1) / 2
  if mid * divisor > dividend:
    high = mid - 1
  else
    low = mid
quotient = low

(Pseudo)kod nie był testowany. Na końcu powinno być low == high, oba równe wynikowi dzielenia.

0

Dzielną i dzielnik można rozłożyć na czynniki pierwsze, potem wyeliminować wspólne czynniki.

21294 / 16380 = 1.3
(2 * 3 * 3 * 7 * 13 * 13) / (2 * 2 * 3 * 3 * 5 * 7 * 13) = 1.3
(13) / (2 * 5) = 1.3
0

Kiedyś się bawiłem w taki sposób
Tyle, że na lazarusie
Tam można wprowadzać własne operatory i takich liczb jak int2048 można używać ze zwykłymi znakami +-*/ :=
Tylko nie jest to szybkie, wydajne, czy w ogóle godne polecenia do działania wydajnego
Dołaczam moduł (jest duuuuży i kompiluje się ok minuty)
Ale w delphi musisz przełożyć z operatorów na funkcje i procedury
Chyba, że w nowszej wersji działają te operatory, mogę nie być z tym na bieŻąco (Boże, widzisz takie błędy i nie grzmisz)

A jeśli chodzi o konwertowanie na tekst, to... nie polecam dla większych, niż int2048
I zalecam korzystanie z typów unsigned

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