Cod sursa(job #487141)

Utilizator nautilusCohal Alexandru nautilus Data 23 septembrie 2010 21:51:23
Problema Prod Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include<fstream>
#define dmax 1020
using namespace std;

long cif[12],tcif;
int nrcifa,a[dmax],nrcifb,b[dmax];
int nrcifprodus,produs[dmax];


int comparare()
{
 long i=1;
 
 while (a[i] == b[i] && i <= nrcifa)
	 i++;
 
 if (a[i] > b[i])
	 return 1; else
	 return 0;
}


void generare()
{
 long i;
	
 while (tcif != 0)
	 {
	  for (i=9; i>=1; i--) /*iau fiecare tip de cifra*/
		  if (cif[i]!=0) /*daca sunt nefolosite*/
			  {
			   tcif-=cif[i];
			   while (cif[i]!=0)
				  {	
				   if (nrcifa > nrcifb || (nrcifa == nrcifb && comparare())) /*daca numarul a este mai mare ca numarul b*/
					   {
					    nrcifb++;
						b[nrcifb]=i;
					   } else
					   {
					    nrcifa++;
						a[nrcifa]=i;
					   }
				   cif[i]--;
				  }
			  }
	 }
}


void inversare()
{
 long i,aux;
	
 for (i=1; i<=nrcifa/2; i++)
	 {
	  aux=a[i];
	  a[i]=a[nrcifa-i+1];
	  a[nrcifa-i+1]=aux;
	 }
	
 for (i=1; i<=nrcifb/2; i++)
	 {
	  aux=b[i];
	  b[i]=b[nrcifb-i+1];
	  b[nrcifb-i+1]=aux;
	 }
}


void inmultire()
{
 long i,j,cifra,transport;
	
 for (i=1; i<=nrcifb; i++)
	 {
	  transport=0;
	  for (j=1; j<=nrcifa; j++)
		  {
		   cifra=produs[i+j] + a[j] * b[i] + transport;
		   produs[i+j]=cifra % 10;
		   transport=cifra / 10;
		  }
	  if (transport)
		  produs[i+j]=transport;
	 }
 
 nrcifprodus=nrcifa+nrcifb;
 if (produs[nrcifprodus]==0)
	 nrcifprodus--;
}


ofstream fout("prod.out");

void afisare()
{ 
 long i;
 
 for (i=nrcifprodus+1; i>=2; i--)
	 fout<<produs[i];
}


int main()
{
 long i;
	
 ifstream fin("prod.in");
 for (i=1; i<=9; i++)
	 {
	  fin>>cif[i];
	  tcif+=cif[i];
	 }
 
 generare();
 inversare();
 inmultire();
 afisare();
 
 fin.close();
 fout.close();
	
 return 0;
}