#include #include using namespace std; typedef unsigned int u32; const unsigned int MAX = 1001; template inline A max(A parm1, A parm2) { if( parm1 > parm2) return parm1; else return parm2; } class duza_liczba { public: bool znak; char Cyfry[MAX]; u32 wskaznik; duza_liczba(); void wczytaj(); void wypisz(); void czysc(); void rozszerz(u32 parm1); void skroc(); void wyeliminuj_10(); void wyeliminuj_ujemne(); bool jest_zerem(); duza_liczba operator/(duza_liczba &parm1); duza_liczba operator*(duza_liczba &parm1); bool operator+=(duza_liczba &parm1); bool operator-=(duza_liczba &parm1); bool operator%=(duza_liczba &parm1); bool operator<=(duza_liczba &parm1); bool porownaj_z_mod(duza_liczba &parm1, u32 parm2); bool odejmij_z_mod(duza_liczba &parm1, u32 parm2); void dodaj_z_mod(duza_liczba *parm1, char co, u32 gdzie); }; int main() { duza_liczba a, b; char dzialanie; while( true ) { a.wczytaj(); getchar(); dzialanie = getchar(); b.wczytaj(); if( a.jest_zerem() && b.jest_zerem() && dzialanie == '+') break; if( dzialanie=='+' ) { a += b; a.wypisz(); } else if( dzialanie=='-' ) { if( b<=a ) { a -= b; a.wypisz(); } else { b -= a; b.znak = true; b.wypisz(); } } else if( dzialanie=='/' ) { (a/b).wypisz(); } else if( dzialanie=='%' ) { a %= b; a.wypisz(); } else if( dzialanie=='*' ) { (a*b).wypisz(); } a.czysc(); b.czysc(); } return 0; } duza_liczba::duza_liczba() { znak = false; wskaznik = 0; for( u32 i = 0 ; i0 ; wskaznik-- ) Cyfry[wskaznik] = 0; Cyfry[0] = 0; } void duza_liczba::wczytaj() { char Tmp[MAX]; scanf("%s", Tmp); wskaznik = strlen(Tmp)-1; for( int j = 0, i = wskaznik ; i>=0 ; i--, j++ ) Cyfry[i] = Tmp[j]-'0'; } void duza_liczba::wypisz() { if( znak ) printf("-"); for( int i = wskaznik ; i>=0 ; i--) printf("%c", Cyfry[i]+'0' ); printf("\n"); } void duza_liczba::rozszerz( u32 parm1 ) { wskaznik = parm1; } void duza_liczba::skroc() { for( ; wskaznik>0 ; wskaznik-- ) if( Cyfry[wskaznik] != 0 ) break; } bool duza_liczba::jest_zerem() { return (wskaznik == 0) && (Cyfry[0] == 0); } bool duza_liczba::operator+=(duza_liczba &parm1) { rozszerz( max(wskaznik, parm1.wskaznik) + 1 ); for( int i = parm1.wskaznik ; i>=0 ; i-- ) Cyfry[i] += parm1.Cyfry[i]; wyeliminuj_10(); skroc(); return true; } void duza_liczba::wyeliminuj_10() { for( u32 i = 0 ; i 9 ) { Cyfry[i] -= 10; Cyfry[i+1] += 1; } } void duza_liczba::wyeliminuj_ujemne() { for( u32 i = 0 ; i parm1.wskaznik ) return false; for( int i = wskaznik ; i>=0 ; i-- ) { if( Cyfry[i]parm1.Cyfry[i] ) return false; } return true; } bool duza_liczba::porownaj_z_mod(duza_liczba &parm1, u32 parm2) { if( wskaznik > parm1.wskaznik+parm2 ) return true; else if( wskaznik < parm1.wskaznik+parm2 ) return false; for( int i = parm1.wskaznik ; i>=0 ; i-- ) { if( Cyfry[i+parm2]>parm1.Cyfry[i] ) return true; else if( Cyfry[i+parm2]= 0 ; kicker-- ) { while( this->porownaj_z_mod(parm1, kicker) ) { this->odejmij_z_mod(parm1, kicker); tmp.Cyfry[kicker] += 1; //printf("kicker add: %d ",kicker); //this->wypisz(); } } tmp.skroc(); return tmp; } bool duza_liczba::operator%=(duza_liczba &parm1) { int kicker = wskaznik-parm1.wskaznik; for( ; kicker >= 0 ; kicker-- ) { while( this->porownaj_z_mod(parm1, kicker) ) { this->odejmij_z_mod(parm1, kicker); //printf("kicker add: %d ",kicker); //this->wypisz(); } } return true; } void duza_liczba::dodaj_z_mod(duza_liczba *parm1, char co, u32 gdzie) { for( int i = parm1->wskaznik ; i>=0 ; i-- ) Cyfry[i+gdzie] += parm1->Cyfry[i]*co; wyeliminuj_10(); } duza_liczba duza_liczba::operator*(duza_liczba &parm1) { duza_liczba tmp; tmp.rozszerz(MAX-1); for( u32 i = 0 ; i<=parm1.wskaznik ; i++ ) { tmp.dodaj_z_mod(this, parm1.Cyfry[i], i); } tmp.skroc(); return tmp; }