Pagini recente » Istoria paginii utilizator/paraschiv_artur | Cod sursa (job #170831) | Cod sursa (job #354518) | Cod sursa (job #1852495) | Cod sursa (job #1886494)
#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);
}
}
*/