Moze li mi ko objasniti rad sa velikim brojevima u C++. Interesuju me osnovne operacije sa njima (+,-,*,/).
Mail:vdragan1993@gmail.com
Mail:vdragan1993@gmail.com
class BigNumber {
int cif[MaxDig];
int pCif;
public:
BigNumber() { memset(cif, 0, sizeof(cif)); brCif = 1; }
BigNumber( int p ) {
memset(cif, 0, sizeof(cif));
if ( p == 0 ) { brCif = 1; }
else {
brCif = 0;
while ( p > 0 ) {
cif[ brCif++ ] = p % 10;
p /= 10;
}
}
}
ovde cemo dodati jos funkcija ...
void IzbrisiNule();
void Oduzmi( BigNumber b );
void Saberi( BigNumber b );
void Podeli( int delilac ); //<----- ovo je deljenje velikog broja nevelikim
void Pomnozi();
void Ispisi();
}
// papir
123321
+ 54329
-------
177650
void BigNumber::Saberi( BigNumber b )
{
//da bi se broj cifara izjednacio, a posto je moguce da smo sa brojem sa manjim brojem cifara radili mnogo operacija, u nizu cif[] posle pcif elemenata mogu da budu neki bezveze brojevi, tako da ih
stavljamo na 0
for (int i = pcif; i < b.pcif; i++) cif[i] = 0;
for (int i = b.pcif; i < pcif; i++) b.cif[i] = 0;
pcif = max( pcif, b.pcif );
int prenos = 0, p;
for (int i = 0; i < pcif; i++) {
cif[i] = ( cif[i] + b.cif[i] + prenos );
prenos = cif[i] / 10; //<---- samo se mora paziti na prenos !
cif[i] %= 10;
}
if ( prenos > 0 ) { cif[ pcif++ ] = prenos; } // prenos ne moze da sadrzi vise od jednu cifru !
}
// papir
123321
- 54329
-------
68992
void BigNumber::IzbrisiNule()
{
while ( pcif > 1 ) { if ( cif[pcif-1] > 0 ) break; pcif--; }
}
void BigNumber::Oduzmi( BigNumber b )
{
for (int i = 0; i < b.pcif; i++) {
if ( cif[i] < b.cif[i] ) { cif[i] += 10; cif[i+1]--; } //<------------ prebaci jedan sa broja veceg nivoa ukoliko je cif[i] < b.cif[i] !!!
cif[i] -= b.cif[i];
}
for (int i = 0; i < pcif-1; i++)
if ( cif[i] < 0 ) { cif[i] += 10; cif[i+1]--; } //<------- ovo treba uradi jer np. u slucaju 100 - 1, bi bez ovog dobili cif[0] = 9, cif[1] = -9 !!!, cif[2] = 1, a trebamo dobiti cif[0] = 9, cif[1]
= 9, cif[2] = 0 !!!
IzbrisiNule(); //<----------- kako na kraju niza (na pocetku broja) posle oduzimanja mogu da budu nule, treba da ih uklonimo
}
// papir
123321 * 54329
----------------
1109889
246642
369963
493284
+ 616605
----------------
6699906609
void BigNumber::Pomnozi( BigNumber b )
{
BigNumber ret;
BigNumber tr;
int pr;
for (int i = 0; i < pCif; i++) {
tr = BigNumber(0); //<----- rezultat kada cifru[i] drugog broja mnozimo sa celim prvim brojem
pr = 0;
tr.pCif = b.pCif+i; //<----- pomeramo broj na levo jednu cifru, tj. mnozimo ga sa 10, kao na papiru
for (int j = 0; j < b.pCif; j++) {
tr.cif[i+j] = ( cif[i] * b.cif[j] + pr ) % 10;
pr = ( cif[i] * b.cif[j] + pr ) / 10;
}
if ( pr > 0 ) {
tr.cif[ tr.brCif++ ] = pr;
}
ret.Saberi( tr );
}
// prebaci sve iz ret u trenutni
pcif = ret.pcif;
for (int i = 0; i < pcif; i++)
cif[i] = ret.cif[i];
}
// papir
123321 / 15 = 8221 (6)
-120
-----------
33
-30
---------
32
-30
-----------
21
-15
-----------
6
void BigNumber::Podeli( int delilac )
{
int pre = 0,k;
for (int i = pcif-1; i >= 0; i--) {
pre *= 10;
k = ( pre + cif[i] ) % delilac;
cif[i] = ( pre + cif[i] ) / delilac;
pre = k;
}
IzbrisiNule();
}
#define MaxCif 105
class BigNumber {
int cif[MaxDig];
int brCif;
public:
BigNumber() { memset(cif, 0, sizeof(cif)); brCif = 1; }
BigNumber( int p ) {
memset(cif, 0, sizeof(cif));
if ( p == 0 ) { brCif = 1; }
else {
brCif = 0;
while ( p > 0 ) {
cif[ brCif++ ] = p % 10;
p /= 10;
}
}
}
BigNumber( const BigNumber& b ) {
brCif = b.brCif;
for (int i = 0; i < brCif; i++)
cif[i] = b.cif[i];
}
BigNumber operator + ( const BigNumber& b ) {
BigNumber ret;
int pr = 0;
int br = max( brCif, b.brCif );
ret.brCif = br;
for (int i = 0; i < br; i++) {
ret.cif[i] = ( cif[i] + b.cif[i] + pr ) % 10;
pr = ( cif[i] + b.cif[i] + pr ) / 10;
}
if ( pr > 0 ) {
ret.cif[ ret.brCif++ ] = pr;
}
return ret;
}
BigNumber operator * ( const BigNumber& b ) {
BigNumber ret;
BigNumber tr;
int pr;
for (int i = 0; i < brCif; i++) {
tr = BigNumber(0);
pr = 0;
tr.brCif = b.brCif+i;
for (int j = 0; j < b.brCif; j++) {
tr.cif[i+j] = ( cif[i] * b.cif[j] + pr ) % 10;
pr = ( cif[i] * b.cif[j] + pr ) / 10;
}
if ( pr > 0 ) {
tr.cif[ tr.brCif++ ] = pr;
}
ret = ret + tr;
}
return ret;
}
void operator *= ( const BigNumber& b ) {
(*this) = (*this) * b;
}
void operator += ( const BigNumber& b ) {
(*this) = (*this) + b;
}
void Ispisi() {
for (int i = brCif-1; i >= 0; i--)
printf("%d",cif[i]);
printf("\n");
}
};