Cod sursa(job #1886494)

Utilizator BanhidiBanhidi Zoltan Banhidi Data 20 februarie 2017 22:10:50
Problema Factorial Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <stdio.h>

#define MAX_NUMBER 99999999999 
#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);
		double aux1 = (dr - st) / 3.0d;

		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) {
			long long result = normalizeToFive(m1);
			if (result == 0) 
				return 1;
			else
				return result;
		}

		double aux2 = aux1 * 2.0d;

		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;
}

long long powerOf(long long base, long long number) {
	long long count = 0;
	while (number % base == 0) {
		count++;
		number /= base;
	}
	return count;
}

long long traditionalZeroes(long long zeroes) {
	long long power5 = 0, n = 0;
	while(power5 < zeroes) {
		n += 5;
		power5 += powerOf(5, n);
	}
	if (power5 == zeroes)
		return n;
	else
		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() {
	
	for (long long i = 0; i < 100000000; i++) {
		long long t = traditionalZeroes(i);
		long long m = factorialZeroes(i);
		if (t != m) 
			printf("i = %lli t=%lli m=%lli\n", i, t, m);
		if (i % 10000 == 0)
			printf("i = %lli\n", i);
	}
}
*/