Pagini recente » Cod sursa (job #1804136) | Cod sursa (job #3122458) | Cod sursa (job #2956995) | Diferente pentru implica-te/arhiva-educationala intre reviziile 141 si 140 | Cod sursa (job #239944)
Cod sursa(job #239944)
#include "math.h"
#include "stdio.h"
unsigned long long factZeros(unsigned long long n)
{
unsigned long long nr = 0;
int kMax = (int)(log((long double)n)/log(5.0));
for(int k=1; k<=kMax; k++)
{
unsigned long long val = n/(unsigned int)(pow(5.0, k));
nr += val;
}
return nr;
}
int main(void)
{
unsigned long long b = (unsigned long long)pow(2.0, 31.0) - 1;
unsigned long long a = 0;
unsigned int p = 0;
int n=-1;
FILE *fin, *fout;
if((fin = fopen("fact.in", "r")) == NULL)
return -1;
if((fout = fopen("fact.out", "w")) == NULL)
return -1;
fscanf(fin, "%d", &p);
while(1)
{
unsigned long long c = (a + b)/2;
unsigned long long z = factZeros(c);
if(z == p)
{
n = c--;
while(c != 0)
{
z = factZeros(c);
if(z != p)
break;
n = c--;
}
break;
}
else if(z < p && (b - a > 2))
{
a = c;
}
else if(z > p && (b - a > 2))
b = c;
else if(b - a <= 2)
{
unsigned long long z1 = factZeros(a);
unsigned long long z2 = factZeros(b);
unsigned long long z3 = factZeros(c);
if(z1 == p)
{
n = a;
break;
}
else if(z2 == p)
{
n = b;
break;
}
else if(z3 == p)
{
n = c;
break;
}
else break;
}
else break;
}
fprintf(fout, "%d", n);
fclose(fin);
fclose(fout);
return 0;
}