Pagini recente » Cod sursa (job #409993) | Cod sursa (job #893158) | Cod sursa (job #594559) | Cod sursa (job #2854041) | Cod sursa (job #487141)
Cod sursa(job #487141)
#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;
}