Dzielenie B. Dużych Liczb

0

Cześć Wam.
Nie mam pomysłu na algorytm jak za implementować dzielenie gdy moja liczba wygląda tak:

tablica[unsigned long int][unsigned long int][unsigned long int]...[unsigned long int]
index0 index1 index2 index n

No i chodzi o podzielenie liczby przez drugą podobną liczbę...

ja mam takie coś:

 
moja_duza_liczba z;
size_t n=0;
  while(z>b)
  {
    n++;
    z-=b;
  }
  if(z==b)
    n++;
  return z=(unsigned long int)(n);

ale to ma strasznie dużą złożoność ;/ no wiadomo jeszcze, że ta złożoność jest większa jak liczba dzielnika jest o wiele mniejsza od dzielnej.
jak bym chciał podzielić 1000^100/17
to można się naczekać hehe.
Jakieś pomysłu na algorytm ?

0

Czy potrafisz na kartce ręcznie podzielić:
123456789 przez 987
Skoro tak to znasz algorytm znacznie mniej złożony. Z tym że nikt ci nie poinformował że to też jest algorytm :D ponieważ wtedy kiedy cie tego algorytmu uczono słówko "algorytm" było dla ciebie i innych dzieciaków jeszcze zbyt niezrozumiałe.

0
akumulator.liczba.resize(b.liczba.size(),0);
for(size_t i=1; i<=b.liczba.size();++i)
    akumulator.liczba[b.liczba.size()-i]=a.liczba[a.liczba.size()-i];
size_t j=0;
while()
{
  akumulator.insert(liczba.begin(),1,a.liczba[a.liczb.size()-(b.liczba.size()+j]));
  while(akumulator>b)
  {
    n++;
    akumulator-=b;
  }
  if(akumulator==b)
  {
    n++;
    akumulator-=b;
  }
  z.liczba.push_back(n);
  j++
}
z.trim();//ta funkcja usuwa 0 wiodące
return z;
 

Tylko czegoś mi tu brakuje coś mi tu nie gra.

0

Jak podzielić jeżeli wiadomo że Dzielna/Dzielnik będzie nie więcej niż jedna cyfra:

  1. Jeżeli dzielnik jest większy niż dzielna to wynik=0 - koniec.
  2. Obliczamy 2dzielnik jako dzielnik+dzielnik, jeżeli 2dzielnik jest większy niż dzielna to wynik 1 - koniec
  3. Obliczamy 4dzielnik jako 2dzielnik+2dzielnik, jeżeli 4dzielnik jest większy niż dzielna to przejdź do 4 jeżeli nie to przejdź do 5
  4. Obliczamy 3dzielnik jako 2dzielnik+dzielnik, jeżeli 3*dzielnik jest większy niż dzielna to wynik 2 - koniec, jeżeli nie to wynik 3 - koniec
  5. Obliczamy 8dzielnik jako 4dzielnik+4dzielnik, jeżeli 8dzielnik jest większy niż dzielna to przejdź do 6 jeżeli nie to przejdź do
  6. Obliczamy 6dzielnik jako 4dzielnik+2dzielnik, jeżeli 6dzielnik jest większy niż dzielna to przejdź do 7 jeżeli nie to przejdź do 8
  7. Obliczamy 5dzielnik jako 4dzielnik+dzielnik, jeżeli 5*dzielnik jest większy niż dzielna to wynik 4 - koniec, jeżeli nie to wynik 5 - koniec
  8. Obliczamy 9dzielnik jako 8dzielnik+dzielnik, jeżeli 9*dzielnik jest większy niż dzielna to wynik 8 - koniec, jeżeli nie to wynik 9 - koniec

już widzę że coś pochrzaniłem, ale nie muszę spadać, więc poprawię później jak wrócę ale pewnie i tak zrozumiesz i napiszesz sam.

2

W książce "algorytmika praktyczna" (tutaj: http://users.v-lo.krakow.pl/~climek/ebooki/stanczyk.pdf ) znajduje się cały podrozdział o operacjach na dużych liczbach. Myślę że tam znajdziesz odpowiedź na swój problem ;)

0

Jeśli mówimy to o B. buzych liczbach to poniżej dwa ciekawy linki:
http://gmplib.org/manual/Division-Algorithms.html#Division-Algorithms - jak to jest realizowane w bibliotece gmp

oraz
http://www.treskal.com/kalle/exjobb/original-report.pdf

pozdrawiam

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