rendered paste body#include <cstdio>#include <cstring>using namespace std;typedef unsigned int u32;const unsigned int MAX = 1001;template<class A> 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 ; i<MAX ; i++) Cyfry[i] = 0;}void duza_liczba::czysc(){ znak = false; for( ; wskaznik>0 ; 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<wskaznik ; i++) while( Cyfry[i] > 9 ) { Cyfry[i] -= 10; Cyfry[i+1] += 1; } }void duza_liczba::wyeliminuj_ujemne(){ for( u32 i = 0 ; i<wskaznik ; i++) if( Cyfry[i] < 0 ) { Cyfry[i] += 10; Cyfry[i+1] -= 1; } skroc();}bool duza_liczba::operator<=(duza_liczba &parm1){ if( wskaznik < parm1.wskaznik ) return true; else if( wskaznik > parm1.wskaznik ) return false; for( int i = wskaznik ; i>=0 ; i-- ) { if( Cyfry[i]<parm1.Cyfry[i] ) return true; else 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]<parm1.Cyfry[i] ) return false; } return true;}bool duza_liczba::operator-=(duza_liczba &parm1){ for( u32 i = 0 ; i<=parm1.wskaznik ; i++) Cyfry[i] -= parm1.Cyfry[i]; wyeliminuj_ujemne(); return true;}bool duza_liczba::odejmij_z_mod(duza_liczba &parm1, u32 parm2){ for( u32 i = 0 ; i<=parm1.wskaznik ; i++) Cyfry[i+parm2] -= parm1.Cyfry[i]; wyeliminuj_ujemne(); return true;}duza_liczba duza_liczba::operator/(duza_liczba &parm1){ duza_liczba tmp; tmp.rozszerz( wskaznik ); int kicker = wskaznik-parm1.wskaznik; for( ; kicker >= 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;}