Dzielenie duuuużych liczb

0

Przekopałem się szczęśliwie i zrobiłem (!) dodawanie, odejmowanie oraz dzielenie wielkich liczb zapisanych jako napisy. Problem mam teraz najwiekszy z dzieleniem - gdzie mogę znaleźć jakiekolwiek przykłady kodów, algorytmu pisemnego dzielenia? Ja wiem, zaproponujecie pewnie kartkę i ołówek, ale chciałby mieć chociaż małą podpowiedź. Przy innych operacjach korzystalem z http://main.edu.pl/user.phtml?op=lesson&n=32. Ale dzielenia wielkiej liczby przez inną wielką liczbę tam nie widzę. Dzięki.

0

odejmowanie od większej mniejszą aż w SPACJA końcu pierwsza stanie się mniejszą i zliczanie ile razy odjąłeś mniejszą liczbę od większej, potem zostaje Ci reszta z dzielenia

0

@up, bardzo wydajny algorytm, gdy chcemy policzyć a/b, a=99999999999999999999999999999999999999999, b=1.

0

No pomysł niegłupi, ale dla sytuacji którą podał @bo rzeczywiście mało opłacalny ...

0

racja, raczej myślałem o dużych liczbach typu
a = 582628502725492625
i b = 3726152859268

0

Jakieś inne sugestie?

0

spójrz w biblioteki MIRACL, GMP, MPIR, LibTomMath

0

Nic nie znalazłem (chodzi mi o źródła tych bibliotek). Ostatecznie, może zostać takie mozolne dzielenie. Pozostaje problem reszty po przecinku. W programie musze podawac z dokladnoscia wprowadzona przez usera. Np. ktos poda dzialanie 1092389 / 4, poda też ile liczb po przecinku wyświetlić. No i tu jest problem. Bo ja rozumiem, że ogólnie kod byłby taki (na razie na intach):

#include <iostream>
using namespace std;


int* dziel(int a, int b){
    
    int *wyniki = new int[2];
    
    int wynik = a;
    int ile = 0;
    while(wynik > b)
    {
     wynik = wynik - b;
     ile++;
    }
    
    if(wynik == b)
    {
     wynik = wynik - b;
     ile++;
    }

    wyniki[0] = ile;
    wyniki[1] = wynik;

    return wyniki;
}


int main(int argc, char **argv){
    
    int *w = dziel(128984,3);
    cout << w[0] << endl;
    cout << w[1] << endl;

    cin.get();
    return 0;
}

Zobaczcie jednak na kalkulatorze - u mnie reszte pokazuje jako 2, a powinna byc 6 ... No i co z resztą liczb, które są po przecinku?

0

I to jest dla Ciebie " Dzielenie duuuużych liczb" ??? co dla ciebie oznacza duża liczba ? z ilu cyfr ma się składać??

0

Z dowolnej ilosci cyfr :] np. 10^1000000000 :] To tylko przykład, przecież mi chodzi o sam pomysł, na stringi sam to przerobię

0

W takim razie jak chodzi o pomysł to proponuję ci dzielenie pod kreską. Oczywiście dzielną będziesz mieć ograniczoną do int64 która składa się z 19 cyfr.
Ale tu nie będzie problemu bo przecież dzielną możesz podzielić a potem dodać do siebie wynik.

0

Uff, to już ostatnie dzialanie na wielkich liczbach, jakie musze napisac :) U mnie liczby trzymam jako typ string, z tym wyjatkiem, ze "123" oznacza stow dwadzieścia trzy, nie czytam ich od końca. Korzystając ponownie z : http://www.main.edu.pl/user.phtml?op=lesson&n=33 napisałem sobie dzielenie, ktore korzysta z wcześniej napisanych funkcji.

Jednak wynik mnie zadziwił, bo nic się nie wyświetla po wywołaniu funkcji - gdzieś musi byc błąd, tylko gdzie? Wklejam kod głównej funkcji i proszę o pomoc :)

0

zamiast "z[i] = (char)a; " daj "z += a".

0

Dałem, ale dalej to samo, a wyniku nie widać, więc nawet nie wiadomo, czy dobrze liczy ... :/

0

Dość nieczytelny jest ten kod dodatkowo wykorzystujesz w nim własne funkcje, których implementacji tutaj nie zamieściłeś.

0

Ok, kod poprawiłem, jednak dla dzielenia "10" przez "2" wyswietla mi wynik 90 ;/ nie widzę nigdzie błędu, chcociaż pewnie jest gdzieś błąd logiczny, którego nie widzę :( A kody moich funkcji są prawie identyczne jak te tutaj (tych dodatkowych, uzywanych przy dzieleniu) : http://www.main.edu.pl/user.phtml?op=lesson&n=32

0

Byś łaskawie jeszcze wstawił wszystkie funkcję "odejmij" itp bo ze strony http://www.main.edu.pl/user.phtml?op=lesson&n=32 jest kod z pascala a nikomu się teraz nie chce przerabiać tego kodu. więc wstaw łaskawie cały kod.

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