Cod sursa(job #467077)

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

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

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

bool comp ( int A[], int B[] ) {
	if(A[0] < B[0]) return true;
	if(A[0] > B[0]) return false;

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

	return false;
}

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

void mulmare ( int A[], int B[] )   // A <- A * B
{
    int i, j, t, 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 = 0; i < 9; ++i ) {
        scanf ( "%d", &times[i] ) ;

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


    for ( int i = k; i ; --i ) {
        if ( comp ( A, B ) ) { // 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;
}