Cod sursa(job #1525048)

Utilizator felixiPuscasu Felix felixi Data 14 noiembrie 2015 17:57:03
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <cstring>

using namespace std;

const int MAX_N = 2005;

ifstream fin ("prod.in");
ofstream fout ("prod.out");

int frecv[11], cifre[MAX_N], nr_cifre;
int numar[2][MAX_N];

bool comp(int A[MAX_N], int B[MAX_N]) {
    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 addCifra(int A[MAX_N], int cifra) {
    for(int i = A[0]; i; --i)
        A[i+1] = A[i];
    ++A[0];
    A[1] = cifra;
}

void inmult(int A[MAX_N], int B[MAX_N]) {
    int i, j, t, C[MAX_N];
    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));
}

int main() {
    for(int i = 1; i < 10; ++i) {
        fin >> frecv[i];

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


    for(int i = nr_cifre; i; --i) {
        if(comp(numar[0], numar[1])) {
            addCifra(numar[0], cifre[i]);
        } else {
            addCifra(numar[1], cifre[i]);
        }
    }

    inmult(numar[0], numar[1]);
    for(int i = numar[0][0]; i; --i)
        fout << numar[0][i];
}