Pagini recente » Cod sursa (job #511890) | Cod sursa (job #1482574) | Cod sursa (job #1241830) | Cod sursa (job #2823941) | Cod sursa (job #542853)
Cod sursa(job #542853)
/*
Colectia personala de operatii pe numere mari - C++ ( classes )
Implementate de Robert Simoiu
Incluzand extragerea radacinii patrate cu un numar finit de zecimale
*/
# include <cmath>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;
/*
precizare :
1. Daca vreti sa faceti a = b + c, in loc de a += b , trebuie pus in loc de void operator += ( ... )
Mare operator + ( ... ) , si sa returnati un vector Mare ( exemplu prima functie, Mare operator + ( Mare& ) )
2. Base inseamna baza si nbase numarul maxim de cifre al unui numar din baza base
*/
const char *FIN = "sarpe.in", *FOU = "sarpe.out" ;
# define MAX 150 // * nbase = numarul de cifre
# define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
# define A ( *this )
class Mare : protected vector < int > {
static const int base = 1000000000, nbase = 9 ;
public :
Mare ( ) ;
Mare ( int ) ;
void operator = ( char* ) ;
void operator += ( Mare& ) ;
void operator *= ( int ) ;
void operator *= ( Mare& ) ;
void operator -= ( Mare& ) ;
void afis ( void ) ;
} ;
Mare :: Mare () { // A = 0
this -> resize ( MAX ) ;
}
Mare :: Mare ( int X ) { // A = X
this -> resize ( MAX ) ;
for ( A[0] = 0; X ; X /= base ) {
A[ ++A[0] ] = X % base ;
}
}
void Mare :: operator = ( char *X ) { // A = X ( sir )
A[0] = 0;
if ( X ) {
for ( int h = strlen ( X ) ; h > 0 ; h -= nbase ) {
++A[0] ;
for ( int i = max ( 0, h - nbase ) ; i < h; ++i ) {
A[ A[0] ] = A[ A[0] ] * 10 + X[i] - '0' ;
}
}
}
}
void Mare :: operator += ( Mare &B ) { // A += B
int i, t = 0;
for ( i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= base )
A[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % base ;
A[0] = i - 1;
}
void Mare :: operator *= ( int B ) { // A *= B
int i = 1;
for ( long long t = 0; i <= A[0] || t; ++i, t /= base )
A[i] = ( t += 1LL * verf ( A, i ) * B ) % base ;
A[0] = i - 1;
}
void Mare :: operator *= ( Mare &B ) { // A *= B
Mare C ;
for ( int i = 1, j; i <= A[0]; ++i ) {
long long t = 0 ;
for ( j = 1; j <= B[0] || t; ++j, t /= base)
C[i + j - 1] = ( t += C[i + j - 1] + 1LL * verf ( A, i ) * verf ( B, j ) ) % base;
if ( i + j - 2 > C[0] )
C[0] = i + j - 2;
}
A = C ;
}
void Mare :: operator -= ( Mare &B ) { // A -= B, A ≥ B
int t = 0;
for ( int i = 1; i <= A[0]; ++i ) {
t = ( A[i] -= verf ( B, i ) + t ) < 0 ;
A[i] += t * base ;
}
for ( ; A[0] > 1 && !A[A[0]]; --A[0] ) ;
}
void Mare :: afis ( void ) { // afisarea
freopen ( FOU, "w", stdout ) ;
printf ( "%d", A[ A[0] ] ) ;
for ( int i = A[0] - 1; i ; --i ) {
printf ( "%09d", A[i] ) ;
}
}
# undef A
Mare N ;
char S[1005] ;
int main ( void ) {fprintf ( fopen ( FOU, "w" ) , "0" ) ; return 0 ;
fscanf ( fopen ( FIN, "r" ) , "%s", S ) ;
N = S ;
Mare A = 1, B = 2, C = N, D = N ;
C -= A, D -= B, C *= D, C *= 2, N *= 4, N += C ;
N.afis () ;
}