Cod sursa(job #1886420)

Utilizator BanhidiBanhidi Zoltan Banhidi Data 20 februarie 2017 21:18:23
Problema Factorial Scor 95
Compilator c Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>

#define MAX_NUMBER 4500000015
#define MIN_NUMBER 0

long long normalizeToFive(long long number) {
	while (number % 5 != 0) 
		number--;
	return number;
}

long long factorialLeadingZeroesOf(long long number) {
	long long sum = 0;
	double n = (double) number;
	do {
		//printf("n=%lf",n);
		n /= 5.0d;
		sum += (long long) n;
		//printf(" -> %lf sum=%lli\n", n, sum);
	} while (n >= 1.0d);
	return sum;
}

long long factorialZeroes(long long zeroes) {
	long long st = MIN_NUMBER, dr = MAX_NUMBER;

	while (st <= dr) {
		//printf("st=%lli dr=%lli\n", st, dr);
		float aux1 = (dr - st) / 3.0f;

		long long m1 = st + (long long) aux1;
		long long m1_zeroes = factorialLeadingZeroesOf(m1);
		//printf("m1=%lli m1_zeroes=%lli\n", m1, m1_zeroes);
		if (m1_zeroes == zeroes)
			return normalizeToFive(m1);

		float aux2 = aux1 * 2.0;

		long long m2 = st + (long long) aux2;
		long long m2_zeroes = factorialLeadingZeroesOf(m2);
		//printf("m2=%lli m2_zeroes=%lli\n\n", m2, m2_zeroes);
		if (m2_zeroes == zeroes)
			return normalizeToFive(m2);
		else if (m1_zeroes < zeroes && m2_zeroes < zeroes)
			st = m2 + 1;
		else if (m1_zeroes < zeroes && m2_zeroes > zeroes) {
			st = m1 + 1;
			dr = m2 - 1;
		} else 
			dr = m1 - 1;
	}
	
	return -1;
}

int main() {
	long long p;
	char *inputFileName = "fact.in", *outputFileName = "fact.out";
	
	FILE *in = fopen(inputFileName, "r");
	if (in == NULL) {
		printf("Can't open input file with name \"%s\".\n", inputFileName);	
		return -1;
	}
	fscanf(in, "%lli", &p);
	fclose(in);

	FILE *out = fopen(outputFileName, "w");
	if (out == NULL) {
		printf("Can't create file with name \"%s\".\n", outputFileName);
	}
	fprintf(out, "%lli\n", factorialZeroes(p));
	fclose(out);

	return 0;
}

/*
int main() {
	long long x;
	scanf("%lli", &x);
	printf("%lli\n", factorialLeadingZeroesOf(x));
	return 0;
}
*/