Cod sursa(job #674312)

Utilizator PatrikStepan Patrik Patrik Data 5 februarie 2012 23:50:24
Problema Factorial Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
	#include<stdio.h>
	FILE *f , *g ;
	long n , p , c ;
	bool sw;
	
	void citire();
	void solve();
	int fact(long n);
	void tipar();
	
	int main()
	{
		citire();
		solve();
		tipar();
		return 0;
	}
	
	void citire()
	{
		f=fopen("fact.in" , "r" );
		fscanf(f , "%ld" , &p );
		fclose(f);
	}
	
	void solve()
	{
		if(p == 0)
		{
			sw = 1;
			n = 1;
		}
		else
		{
			int ls = 2 , ld = 2000000000 , mijl ;
			while(ls < ld)
			{
				mijl = (ls+ld)/2;
				c = fact(mijl);
				if(c == p)
				{
					n = mijl;
					sw = 1;
					break;
				}
				else
					if(c > p)
						ld = mijl-1;
					else
						ls = mijl+1;
			}
		}
	}
	
	
	void tipar()
	{
		g=fopen("fact.out" , "w" );
		if(!sw)
			fprintf(g , "-1");
		else
		{
			while(n %5)
				n--;
			if(n==0)
				n++;
			fprintf(g , "%ld" , n );
		}
		fclose(g);
	}
	
	int fact(long n)
	{
		int nr2 = 0 , nr5 = 0 , d;
		d = 2;
		while(n/d)
		{
			nr2+=n/d;
			d*=2;
		}
		d = 5;
		while(n/d)
		{
			nr5+=n/d;
			d*=5;
		}
		if(nr2 < nr5)
			return nr2;
		return nr5;
	}