Cod sursă (job #560802)

Utilizator avatar andrei_marciuc Marciuc Andrei andrei_marciuc IP ascuns
Problemă Sqrt (clasele 9-10) Compilator cpp | 3.35 kb
Rundă Arhiva de probleme Status evaluat
Dată 17 iul. 2020 18:40:38 Scor 100
#include <fstream>
#include <cmath>
#define GOD 3000
using namespace std ;
ifstream fin( "sqrt.in" );
ofstream fout( "sqrt.out" );
short v[ GOD ], rez[ GOD / 2 ], vv[ GOD ], val[ GOD ];
short k, n;
char c;

short zerouri( short a[], int poz ){
    int i = poz;
    bool gasit = 0;
    while( !gasit ){
        if( a[ i ] )
            gasit = 1;
        i++;
    }
    return i - 1;
}

void Inmultire( short a[], int poz, int la, int cif, short x[] ){
    int i = la;
    int j = GOD - 2;
    int rest = 0;
    int prod;
    while( i > poz ){
        prod = a[ i ] * cif + rest;
        rest = prod / 10;
        x[ j ] = ( prod - 10 * rest );
        i--;
        j--;
    }
    if( i == poz ){
        prod = a[ i ] * cif + rest;
        rest = prod / 10;
        x[ j ] = ( prod - 10 * rest );
        x[ j - 1 ] = rest;
    }
}

bool Comparare (  short a[], int poz, int la, short b[], int pozz, int lb ){
    int i = poz;
    int j = pozz;
    bool gasit = 0;
    if( la - poz > lb - pozz )
        return 1;
    if( la - poz < lb - pozz )
        return 0;
    if( la - poz == lb - pozz ){
        while( !gasit && i <= la && j <= lb ){
            if( a[ i ] < b[ j ] ){
                gasit = 1;
                return 0;
            }
            if( a[ i ] > b[ j ] ){
                gasit = 1;
                return 1;
            }
            i++;
            j++;
        }
        if( i == la + 1 && j == lb + 1 )
            return 1;
    }
}

void Diferenta( short a[], int poz, int la, short b[], int pozz, int lb ){
    int diff;
    int imp = 0;
    int i = la;
    int j = lb;
    while( j >= pozz ){
        diff = a[ i ] - b[ j ] - imp;
        a[ i ] = diff;
        if( diff < 0 ){
            imp = 1;
            a[ i ] = diff + 10;
        }
        if( diff >= 0 )
            imp = 0;
        j--;
        i--;
    }
    if( imp )
        a[ i ] = a[ i ] - imp;
}

int main( )
{
    int i = 0;
    int j;
    bool gasit;
    fin >> c;
    while( !fin.eof( ) ){
        v[ i ] = c - '0';
        i++;
        fin >> c;
    }

    k = 0;
    if( i % 2 == 1 ){
        rez[ k ] = ( int )sqrt( v[ 0 ] );
        v[ k ] = v[ k ] - rez[ k ] * rez[ k ];
        j = 1;
    }
    if( i % 2 == 0 ){
        k = v[ 0 ] * 10 + v[ 1 ];
        rez[ 0 ] = ( int ) sqrt( k );
        n = rez[ 0 ] * rez[ 0 ];
        v[ 0 ] = ( ( k - n ) / 10 );
        v[ 1 ] = ( k - n ) - v[ 0 ] * 10;
        j = 2;
    }
    fout << rez[ 0 ];
    k = 1;
    while( j < i ){
        Inmultire( rez , 0 , k - 1  , 2 , vv );
        gasit = 1;
        n = 0;
        while( n < 10 && gasit ){
            n = n + 1;
            vv[ GOD - 1 ] = n;
            Inmultire ( vv , zerouri( vv , GOD - j - 2 ) , GOD - 1 , n , val );
            gasit = Comparare ( v , zerouri ( v , 0 ) , j + 1 , val , zerouri ( val , GOD - j - 4 ) , GOD - 2 );
        }
        if( n == 1 ){
            fout << 0;
            rez[ k ] = 0;
        } else {
            fout << n - 1;
            rez[ k ] = n - 1;
            vv[ GOD - 1 ] = n - 1;
            Inmultire ( vv , zerouri( vv , GOD - j - 2 ) , GOD - 1 , n - 1 , val );
            Diferenta ( v , zerouri( v , 0 ) , j + 1 , val , zerouri( val , GOD - j - 4 ) , GOD - 2 );
        }
        j = j + 2;
        k++;
    }
    return 0 ;
}