Pagini recente » Cod sursa (job #1100038) | Cod sursa (job #3150900) | Cod sursa (job #3153445) | Cod sursa (job #2288976) | Cod sursa (job #187858)
Cod sursa(job #187858)
/*
1. Numarul de zerouri finale ale numarului n! este dat de suma
z = [n/5]+[n/25]+[n/125]+...
2. O legatura intre n si z poate fi relatia
s(p, n) = n - (p-1)*z
unde p este baza de numeratie in care se reprezinta n, iar s(p, n)
este suma cifrelor reprezentarii lui n in aceasta baza;
Deoarece factorii 5 sunt mai putini decat factorii 2, am hotarat
sa alegem p=5 si sa gasim un n > 4*z (fara a cauta la infinit !)
pentru care numarul t calculat conform relatiei 1 coincide cu z (dat)
*/
#include <stdio.h>
long int nr_zerouri(long int n) {
long int w, q=5, r=0;
while(w=n/q) {r += w; q *= 5;}
return r;
}
int main() {
long int z, t, n, f=0;
freopen("ec_fact.in", "r", stdin);
freopen("ec_fact.out", "w", stdout);
scanf("%ld", &z);
for(n=z*4; (n<z*5) && (f==0); n+=5) {
t=nr_zerouri(n); if (t==z) f=1;
}
if(!z){f=1;n=1;}
if(f) printf("%ld\n", n); else printf("-1\n");
return 0;
}