Cod sursa(job #1436343)

Utilizator gabriel.badeaGabriel Badea gabriel.badea Data 15 mai 2015 19:20:40
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;

#pragma warning(push)
#pragma warning(disable: 4996)

int primulNr[1100];
int alDoileaNr[1100];
int rezultat[2200];
int nrCartonase[10];

int indexA, indexB;

/* Afla care dintre cele 2 nr este mai mare
* -1, primul mai mic ca al doilea
* 0, cele doua nr sunt egale
* 1, al doilea nr sunt egale
*/
int comparaNumere(int primulNr[1100], int alDoileaNr[1100])
{
	// primul nr are mai putine cifre
	if (primulNr[0] < alDoileaNr[0])
		return -1;
	else if (primulNr[0] > alDoileaNr[0])
		return 1;
	else
	{
		for (int i = 1; i <= primulNr[0]; ++i)
		{
			if (primulNr[i] < alDoileaNr[i])
				return -1;
			else if (primulNr[0] > alDoileaNr[0])
				return 1;
		}
	}
	return 0;
}


void calculeazaProdus(int primulNr[1100], int alDoileaNr[1100])
{
	int transport = 0;

	rezultat[0] = primulNr[0] + alDoileaNr[0] - 1;

	for (int i = 1; i <= primulNr[0]; ++i)
	{
		for (int j = 1; j <= alDoileaNr[0]; ++j)
		{
			rezultat[i + j - 1] += primulNr[i] * alDoileaNr[j];
		}
	}

	for (int i = 1; i <= rezultat[0]; ++i)
	{
		rezultat[i] += transport;
		transport = rezultat[i] / 10;
		rezultat[i] %= 10;
	}

	if (transport)
	{
		rezultat[0]++;
		rezultat[rezultat[0]] = transport;
	}
}


int main()
{
	freopen("prod.in", "r", stdin);
	freopen("prod.out", "w", stdout);

	for (int i = 1; i <= 9; ++i)
	{
		scanf("%d", &nrCartonase[i]);
	}

	indexA = 1;
	indexB = 1;

	for (int i = 9; i >= 1; --i)
	{
		while (nrCartonase[i] > 0)
		{
			// adaugam o cifra la primul nr
			if (comparaNumere(primulNr, alDoileaNr) < 0)
			{
				primulNr[0] = indexA;
				primulNr[indexA] = i;
				indexA++;
			}
			else
			{
				alDoileaNr[0] = indexB;
				alDoileaNr[indexB] = i;
				indexB++;
			}

			nrCartonase[i]--;
		}
	}

	// inversam numerele incepand cu pozitia 1 pentru a fi mai usor sa facem produsul celor 2 nr
	reverse(primulNr + 1, primulNr + 1 + primulNr[0]);
	reverse(alDoileaNr + 1, alDoileaNr + 1 + alDoileaNr[0]);

	// facem produsul celor 2 nr
	calculeazaProdus(primulNr, alDoileaNr);

	for (int i = rezultat[0]; i > 0; --i)
	{
		printf("%d", rezultat[i]);
	}


	return 0;
}

#pragma warning(pop)