All pastes #25686 Raw Edit

problem z kompilacj#261; na ki.staszic.waw.pl

public cpp v1 · immutable
#25686 ·published 2005-10-16 18:54 UTC
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;}