Cod sursa(job #347083)

Utilizator valentinroscaRosca Valentin valentinrosca Data 10 septembrie 2009 21:06:44
Problema Factorial Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<math.h>
#include<fstream.h>
ifstream fin("fact.in");
ofstream fout("fact.out");
long n,m,i,j,ct,s,a[100],b[100],c[200],aux,ct1,z,k,rez=1,n1,o,cif,co,crez;
int main()
{
	fin>>k;
	if(k==0)
		fout<<1;
	else
		for(o=1;o<=12;o++)
			rez=rez*o;
		if(k<=12)
		{
			for(o=1;o<=k;o++)
				rez=rez*o;
			fout<<rez;
		}
		else
		{
			for(o=13;o<=k;o++)
			{
				if(o==13)
				{
					n=(long)log10(rez)+1;
					crez=rez;
					do
					{
						cif=crez%10;
						n--;
						a[n]=cif;
						crez=crez/10;
					}
					while(crez);
					n=(long)log10(rez)+1;
				}
				if(o!=13)
				{
					j=0;
					for(i=n+m-1;i>=0;i--)
					{
						a[j]=c[i];
						j++;
					}
				}
				co=o;
				m=(long)log10(o)+1;
				do
				{
					cif=co%10;
					m--;
					b[m]=cif;
					co=co/10;
				}
				while(co);
				m=(long)log10(o)+1;
				for(i=0;i<n/2;i++)
				{
					aux=a[i];
					a[i]=a[n-i-1];
					a[n-i-1]=aux;
				}
				for(j=0;j<m/2;j++)
				{
					aux=b[j];
					b[j]=b[m-j-1];
					b[m-j-1]=aux;
				}
				for(i=0;i<n;i++)
					for(j=0;j<m;j++)
						c[i+j]=c[i+j]+a[i]*b[j];
					ct=c[0]/10;
					c[0]=c[0]%10;
					for(i=1;i<=n+m-1;i++)
					{
						s=c[i]+ct;
						ct=s/10;
						c[i]=s%10;
					}
					z=n+m-1;
					for(i=n+m-1;i>=0;i--)
						if(i==z)
							if(c[i]==0)
								z--;
							else		
								fout<<c[i];
							else
								fout<<c[i];
			}
		}
		return 0;
}