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

Dzielenie dużych liczb, większych niż mieści Int64.
OR
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:10
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 :)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
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ć.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
OR
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:10
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 :)

Patryk27
Jest jeszcze uint64/qword ;P
KO
trzymaj to jako literki. Z tego co pamiętam, chyba sam wrzucałem gotowca na tym forum, wystarczy poszukać.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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).


edytowany 3x, ostatnio: Patryk27
OR
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:10
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?

_13th_Dragon
div też masz zaimplementować samodzielnie przez dodawanie.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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


Sopelek
a co jeśli te liczby są pierwsze? Albo chociaż i tak po podzieleniu dzielnik będzie za duży?
Patryk27
Wtedy pozostaje implementowanie div poprzez dodawanie/odejmowanie.
OR
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:10
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 :).

unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
0

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


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 1x, ostatnio: unikalna_nazwa
OR
  • Rejestracja:prawie 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:10
0

div też masz zaimplementować samodzielnie przez dodawanie

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

Wielkie dzięki !!

unikalna_nazwa
ale to nie jest najlepszy pomysł... przy niektórych liczbach może to trwać wiecznie
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:3 minuty
0

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

Kopiuj
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.


"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 1x, ostatnio: Wibowit
DE
  • Rejestracja:prawie 7 lat
  • Ostatnio:prawie 7 lat
  • Postów:1
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
flowCRANE
Starszego wątku nie znalazłeś? o.O
P2
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Lokalizacja:okolice Pińczowa
  • Postów:73
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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)