Cod sursa(job #949035)

Utilizator MathPlayerPopescu Bogdan Constantin MathPlayer Data 12 mai 2013 10:41:02
Problema Factorial Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>

#define INPUT_FILE	"fact.in"
#define OUTPUT_FILE	"fact.out"
#define TRUE		1
#define FALSE		0
#define INVALID_RESULT	-1

/***   DATA   VARIABLES   ***/
FILE *f;
unsigned long p, n = INVALID_RESULT;

/***   READ   AND   WRITE   FUNCTIONS   ***/
void read()
{
	f = fopen(INPUT_FILE, "rt");
	fscanf(f, "%d", &p);
	fclose(f);
}

void write()
{
	f = fopen(OUTPUT_FILE, "wt");
	fprintf(f, "%d", n);
	fclose(f);
}


/***   SOLVING   PROBLEM   FUNCTIONS   ***/
unsigned long getZeros(unsigned long value)
{
	unsigned long x;
	unsigned long answer = 0;
	for (x = 5; x <= value; x *= 5)
		answer += value / x;
	return answer;
}

void solve()
{
	unsigned long min = 1, max = 100000000;
	unsigned long med, zeros;
	while (min < max) {
		med = (min + max) / 2;
		zeros = getZeros(med);
		if (zeros == p) {
			if (med < 5)
				n = 1;
			else
				n = med - med % 5;
			return;
		} else if (zeros > p) {
			max = med - 1;
		} else {
			min = med + 1;
		}
	}
	n = INVALID_RESULT;
}


/***   MAIN   ***/
unsigned long main()
{
	read();
	solve();
	printf("p = %8d, n = %8d\t", p, n);
	write();
	return 0;
}