Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] reszta z dzielenia nieskończenie dużych liczb

harry88pl 13 Mar 2010 11:04 3852 5
  • #1 13 Mar 2010 11:04
    harry88pl
    Poziom 12  

    Witam

    Mam bardzo duży problem :( Do napisania mam 3 programy:

    1. Dodawania nieskończenie dużych liczb a + b
    2. Odejmowanie nieskończenie dużych liczb a - b
    3. Reszta z dzielenia nieskończenie dużych liczb a / b

    Jeżeli chodzi o "nieskończenie" to że ma być obojętnie jak duża liczba - może mieć nawet 1000 czy 10000 znaków. Domyślam się że trzeba będzie zrobić to za pomocą tablicy, bo innej możliwości niema. Jeżeli dowiem się jak zrobić tablicę o n elementach to pierwsze 2 zrobię na pewno - bo nie ma problemu. Zrobię aby sprawdził program ilość elementów tablicy, po czym będzie miał dodawać każdy element tablicy i zapisywać do kolejnej o również n elementach - na zasadzie dodawania i odejmowania "na kartce". Ale co to reszty z dzielenia to nie mam żadnego pomysłu jak zrobić normalnie jest to a%b ale jak to zrobić w przypadku tablic?

    Proszę o jakąkolwiek pomoc - jak mam to w ogóle ugryźć

    Oraz o jakąś pomoc jak zrobić tablice o n elementach?

    Z góry bardzo dziękuję i proszę o pomoc

    Jak napiszę jakieś części programu to wkleję tutaj

    0 5
  • Pomocny post
    #3 13 Mar 2010 11:51
    arnoldziq
    Moderator Programowanie

    Może to cię naprowadzi na metodę operowania na dużych liczbach całkowitych (DEV-C++4.9.9) :

    Code:
    #include <iostream>
    
    #include <string>
    using namespace std;
    int main()
          {
          int l1,k=0, i, l2,j,p;
          char s_num1[110], s_num2[110], s_ans[111];
          int tens=0, ones, ans;
          cout<<"Podaj pierwsza liczba : ";
          cin>>s_num1;
          cout<<"Podaj druga liczba    : ";
          cin>>s_num2;
         
          for(l1=0;s_num1[l1]!='\0';l1++);
          for(l2=0;s_num2[l2]!='\0';l2++);
          l1--;
          l2--;
          for(i=l1, j = l2;(i>=0)&&(j>=0);i--,j--){
            ans = (int) s_num1[i] + (int) s_num2[j] + tens - 2*48;
            ones=ans%10;
            tens=ans/10;
            s_ans[k] = ones + 48;
            k++;
          }
          while(i>=0){
            ans = tens + (int) s_num1[i] -48;
            ones=ans%10;
            tens=ans/10;
            s_ans[k] = ones + 48;
            k++;
            i--;
         }

         while(j>=0){
          ans = tens + (int) s_num2[j] -48;
          ones=ans%10;
          tens=ans/10;
          s_ans[k] = ones + 48;
          k++;
          j--;
        }
          if(tens!=0)
          s_ans[k++] = tens+48;
          cout<<"Dlugosc ciagu : "<<k<<endl<<"Wynik dodawania : ";
          for(p=k-1;p>=0;p--)
          cout<<s_ans[p];
         
          cout<<"\n \n \n Nacisnij 0 i ENTER aby zakonczyc.";
          cin>>s_num1;;
          return 0;
    }

    Jest 'małe' ograniczenie w kodzie : liczby mogą mieć maksymalnie 110 cyfr. Ale można to w 3 sekundy przerobić :) Życzę powodzenia.

    0
  • #4 13 Mar 2010 13:05
    Dżyszla
    Poziom 42  

    arnoldziq, jeśli program ma operować na teoretycznie nieskończonych liczbach, to użycie tablic statycznych odpada. Co nie zmienia faktu, że algorytm pozostaje ten sam, choć nie jest on specjalnie złożonym.

    BTW - operacji wcale nie trzeba przeprowadzać w systemie dziesiętnym, lecz z powodzeniem można wykorzystać BCD lub nawet system dwustupiędziesięciopiątkowy.

    0
  • #5 13 Mar 2010 15:32
    harry88pl
    Poziom 12  

    Dziękuje 'arnoldziq' za kod - bardzo pomocny, tablice dynamiczną już zrobię sam, bo znalazłem na to przepis :) więc myślę że będzie działało :) z resztą z dzielenia nadal nic nie znalazłem :(

    'Dżyszla' również dziękuję Ci za zainteresowanie, ale to tym systemie dwustupiędziesięciopiątkowym nawet google nic nie wiedzą :(

    no nic, będę jeszcze próbował, jeśli coś konkretnego już sklecę, to przedstawię na forum.

    Pozdrawiam i dziękuje za zainteresowanie
    Harry

    0
  • #6 13 Mar 2010 15:53
    Dżyszla
    Poziom 42  

    System liczbowy jak każdy inny - zamiast marnować bajt pamięci na jedną cyfrę mógłbyś w nim przechowywać znacznie więcej. Ale to już akademicka zabawa.

    Co do dzielenia - możesz zrobić tak, jak dzielenie pod kreską ;) Gdzieś miałem algorytm rozrysowany, ale zapodziałem :( Jak znasz assemblera, to moze wyczaisz - jest to w 3J wykonane: http://www.dzyszla.aplus.pl/programy_i_teksty-17.html

    Edit: znalazłem ten algorytm: http://forum.dzyszla.aplus.pl/topic127-1.html#p1015

    0