Pagini recente » Cod sursa (job #522938) | Cod sursa (job #1260573) | Cod sursa (job #1418943) | Cod sursa (job #1994871) | Cod sursa (job #1886425)
#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)
return normalizeToFive(m1);
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;
}
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;
}
*/