Cod sursa(job #466633)

Utilizator Mishu91Andrei Misarca Mishu91 Data 27 iunie 2010 12:27:15
Problema Prod Scor 100
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 1.18 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];
}