[ android~paranoid @ 17.03.2006. 09:59 ] @
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?
[ Mali Misha @ 17.03.2006. 10:49 ] @
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.
[ idb @ 17.03.2006. 12:14 ] @
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
[ android~paranoid @ 18.03.2006. 17:11 ] @
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]