Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Klasa za rad s velikim brojevima (100 cifara)

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Klasa za rad s velikim brojevima (100 cifara)

[ Pregleda: 2898 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

android~paranoid

Član broj: 81947
Poruke: 211
*.infosky.net.



Profil

icon [Zadatak] Klasa za rad s velikim brojevima (100 cifara)17.03.2006. u 09:59 - pre 219 meseci
Zadatak mi je da napravim klasu velikih brojeva (100 cifara) pomocu koje se ovaj program
izvrasava:

Code:
#include "bignum.h"

void main (void)
{
   BIGNUM rezultat, br1("2356723544523"), br2 ;
   br2.unos ();
   rezultat = br1 + br2 ;
   rezultat.prikaz ();


Ovo za neke brojeve radi, recimo za 7777 nista ne ispise, za neke druge brojeve
ispise tacno resenje, iz tog testiranja nisam mogao da skontam zbog cega je to (nije problem
prenosenje jedinice).

Code:
BIGNUM BIGNUM::operator+ (BIGNUM y)
{

    BIGNUM pom;
    int i=0,k,j;

        k=strlen(br)-1;
    j=strlen(y.br)-1;

    int c=0; //sluzi za ispitivanje da li treba preneti jedinicu
    int l=0; //ovo ce biti ta jedinica i ona ce se dodavati

    while ((k>=0) && (j>=0))
    {

      if (c==1)
      {
          l=1;
          c=0;
      }
      else
      {
          l=0;
          c=0;
      }

      if (((br[k]-48)+(y.br[j]-48))>=10)
       {
              pom.br[i]=l+((br[k]-48)+(y.br[j]-48))%10; 
           c=1;
      }
      else
      {
        pom.br[i]=l+((br[k]-48)+(y.br[j]-48));
      }

         k--;
         j--;
         i++;
    }
    
    if (k) //nisam uzimao da je veci broj od onog inicijalizovanog pri testiranju
               //ako je drugi veci broj onda ide ovako isto...
    {
        while (k>=0)
        {
            pom.br[i]=l+br[k]-48;
            k--;
            i++;
        }
    }

    pom.br[i]='\0';

    return pom;
}

...

void BIGNUM::prikaz()
{
    for(int i=0;i<strlen(br);i++)
      br[i]+=48;

    for(i=strlen(br)-1;i>=0;i--)
    {
//      if ((br[i]>=48) && (br[i]<=57))
       cout << br[i];
    }
}


Klasa:

#ifndef _BIGNUM_h_
   #define _BIGNUM_h_

class BIGNUM 
{
     
   char br[101];

public:
    BIGNUM () {};
    ~BIGNUM () {};
    
    BIGNUM(char[]);

    void unos();
    void prikaz();

    BIGNUM operator+ (BIGNUM);
};

#endif

Konstruktor:

BIGNUM::BIGNUM(char x1[101])
{
   strcpy(br,x1);
}



Ispisao sam skoro sve, posto nemam jos toliko iskustva sa programima u c++ - u,moguce je da
sam napravio neku pocetnicku gresku.

Posto ne znam unapred velicinu tog niza brojeva, ja sam to smestao redom u pom(od 0),
a pri ispisu samo obrnem redosled. Gde je greska?

Mislim, šta reći !
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: [Zadatak] Klasa za rad s velikim brojevima (100 cifara)17.03.2006. u 10:49 - pre 219 meseci
Predlozi:

- brojevi mogu da budu belezeni i tako da jedinice budu na nultom, desetice na prvom, stotine na drugom itd. char-u.

- niz se moze cuvati u rangu '0'-'9' umesto 0-9. Posao sabiranja bi bio otprilike isti: ako je a[ i ]+=(b[ i ]-'0')>'9', tada a[i+1]++ i a[ i ]-=10.

Mislim i da code moze da bude dosta kraci... mozda se ukljucim kasnije.
Ipak se ++uje.
 
Odgovor na temu

idb
Ivan Bulic
Beograd

Član broj: 4436
Poruke: 402



Profil

icon Re: [Zadatak] Klasa za rad s velikim brojevima (100 cifara)17.03.2006. u 12:14 - pre 219 meseci
Nisam se bavio ovim, ali evo pogledaj kako su neki drugi to uradili:
http://mysite.verizon.net/hashproduct/bigint/index.html
http://www.koders.com/cpp/fid6...39A8A622699652E70F5EC7A09.aspx
BTW imas toga jos dosta na netu
 
Odgovor na temu

android~paranoid

Član broj: 81947
Poruke: 211
*.zrlocal.net.



Profil

icon Re: [Zadatak] Klasa za rad s velikim brojevima (100 cifara)18.03.2006. u 17:11 - pre 219 meseci
Evo ga, sad radi !

Code:
#include <string.h>
#include <iostream.h>
#include "bignum.h"


BIGNUM::BIGNUM (char x1[101])
{
   strcpy(br,x1);
}


void BIGNUM::unos()
{
     cout << "Unesi celobrojan broj: ";
    cin >> br;
}

void BIGNUM::prikaz()
{

    for(int i=strlen(br)-1;i>=0;i--)
    {
       cout << br[i];
    }
}


BIGNUM BIGNUM::operator+ (BIGNUM y)
{

    BIGNUM pom;
    int i=0,k,j;

    k=strlen(br)-1;
    j=strlen(y.br)-1;

    int c=0;
    int l=0;

    while ((k>=0) && (j>=0))
    {

      if ((l+(br[k]-48)+(y.br[j]-48))>=10)
       {
              pom.br[i]=(l+(br[k]-48)+(y.br[j]-48))%10+48 ;
           c=1;
      }
      else
      {
        pom.br[i]=l+((br[k]-48)+(y.br[j]-48))+48;
        c=0;
      }
     
      if (c==1)
      {
          l=1;
          c=0;
      }
      else
      {
          l=0;
          c=0;
      }

         k--;
         j--;
         i++;
    }
    
    if (k>=0)
    {
        while (k>=0)
        {
            pom.br[i]=l+br[k];
            l=0;
            k--;
            i++;
        }
    }

    else if (j>=0)
    {
        while (j>=0)
        {
            pom.br[i]=l+y.br[j];
            l=0;
            j--;
            i++;
        }
    }
    
    pom.br[i]='\0';

    return pom;
}


[Ovu poruku je menjao android~paranoid dana 20.03.2006. u 16:52 GMT+1]
Mislim, šta reći !
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Klasa za rad s velikim brojevima (100 cifara)

[ Pregleda: 2898 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.