Cod sursa(job #467041)

Utilizator SpiderManSimoiu Robert SpiderMan Data 28 iunie 2010 11:06:48
Problema Prod Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
# include <cstdio>
# include <string>

const char FIN[] = "prod.in", FOU[] = "prod.out";
const int MAX = 2005;

int times[10], A[MAX], B[MAX];
int cifre[MAX >> 1] ;

inline int comp ( int A[], int B[] )   // A ? B , ? == <, >, =
{
    if ( A[0] < B[0] ) return -1;
    else if ( A[0] > B[0] ) return 1;

    for ( int i = A[0]; i > 0; --i ) {
        if ( A[i] < B[i] )  {
            return -1;
        } else if ( A[i] > B[i] ) {
            return 1;
        }
    }

    return 0;
}

void adauga ( int A[], int X )
{
    memcpy ( &A[A[0]++ + 1], &A[ 1 ], sizeof ( int ) * A[ 0 ] ) ;
    A[1] = X ;
}

void mulmare ( int A[], int B[] )   // A <- A * B
{
    int i, j, t;
    int C[MAX];        // C <- A * B

    memset ( C, 0, sizeof( C ) ) ;

    for (i = 1; i <= A[0]; i++) {
        for (t = 0, j = 1; j <= B[0] || t; j++, t /= 10) {
            C[i + j - 1] = ( t += C[i + j - 1] + A[i] * B[j] ) % 10;
        }
        if ( i + j - 2 > C[0] ) C[0] = i + j - 2;
    }

    memcpy ( A, C, sizeof( C ) ) ;   // A <- C
}

void write ( int A[] )
{
    for (int i = A[0]; i; --i) {
        printf ( "%d", A[i] ) ;
    }
}

int main()
{
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    int k = 0 ;

    for ( int i = 1; i < 10; ++i ) {
        scanf ( "%d", &times[i] ) ;

        for (int j = 1; j <= times[i]; ++j) {
            cifre[++k] = i ;
        }
    }


    for ( int i = k; i ; --i ) {
        if ( comp ( B, A ) == 1 ) { // decat sa adaug la sfarsit si sa inversez vectorul
            adauga ( A, cifre[i] ) ;      // mai bine adaug direct la inceput
        } else {
            adauga ( B, cifre[i] ) ;
        }
    }

    mulmare ( A, B ) ;

    write ( A ) ;

    return 0;
}