Cod sursa(job #915525)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 martie 2013 09:31:32
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define Nmax 128

char s[Nmax];
typedef short int BigNumber[Nmax];

BigNumber A, B, C;

void citire(){

    ifstream f("sarpe.in");

    f.getline( s, Nmax );

    for ( int i = strlen( s ) - 1; i >= 0; i-- )
        A[ ++A[0] ] = s[i] - 48;

    f.close();
}

void afis(BigNumber a){

    ofstream g("sarpe.out");

    for(int i = a[0]; i; i--)
        g << a[i];

    g << endl;

    g.close();
}

void inmul(int x, BigNumber a){

    int T = 0;

    for ( int i = 1; i <= a[0]; i++ )
        a[i] = a[i] * x + T,
        T = a[i] / 10,
        a[i] %= 10;

    while ( T )
        a[ ++a[0] ] = T % 10,
        T /= 10;
}

void scadere(BigNumber a, BigNumber b){

    int T = 0;

    for ( int i = 1; i <= a[0]; i++ )
        a[i] += ( T = ( a[i] -= b[i] + T ) < 0 ) ? 10 : 0;

    while ( !a[ a[0] ] )
        a[0]--;
}

void inmultire(BigNumber a, BigNumber b, BigNumber c){

    int T = 0;

    c[0] = a[0] + b[0] - 1;

    for ( int i = 1; i <= a[0]; i++ )
        for ( int j = 1; j <= b[0]; j++ )
            c[ i + j - 1 ] += a[i] * b[j];

    for ( int i = 1; i <= c[0]; i++ )
         T = ( c[i] += T ) / 10,
         c[i] %= 10;

    if (T)
      c[ ++c[0] ] = T;
}

void aduna(int x, BigNumber a){

    int T = 0;

    for ( int i = 1; i <= a[0]; i++, x /= 10 )
        a[i] += T + x,
        T = a[i] / 10,
        a[i] %= 10;

    while( T )
        a[ ++a[0] ] = T % 10,
        T /= 10;
}

void copiaza(BigNumber a, BigNumber b){

    a[0] = b[0];

    for ( int i = 0; i <= a[0]; i++ )
        a[i] = b[i];
}

void rezolva(){

    copiaza(B, A);
    inmultire(A, A, C);
    inmul(2, B);
    scadere(C, B);
    aduna(4, C);
}


int main(){

    citire();
    rezolva();
    afis(C);

    return 0;
}