Pagini recente » Cod sursa (job #221777) | Cod sursa (job #1581236) | Cod sursa (job #1766637) | Cod sursa (job #403302) | Cod sursa (job #527319)
Cod sursa(job #527319)
PROGRAM FACTORIAL; {~~~METODA EFICIENTA~~~}
(*
Sa se gaseasca cel mai mic numar natural nenul N (daca exista) astfel
incat N! are exact P cifre de zero la sfarsit.
*)
{------------------------------------------------}
FUNCTION NR_FACT_5(K:LONGINT):BYTE;
{Returneaza numarul factorilor de 5 din descompunerea numarului K.}
VAR NR:BYTE;
BEGIN
NR:=0;
WHILE (K MOD 5 = 0) DO BEGIN
NR:=NR+1;
K:=K DIV 5;
END;
NR_FACT_5:=NR;
END;
{------------------------------------------------}
VAR N,P,NR0,I:LONGINT;
P5:ARRAY[1..12] OF LONGINT;
F,G:TEXT;
BEGIN
ASSIGN(F,'fact.in'); RESET(F);
ASSIGN(G,'fact.out'); REWRITE(G);
READ(F,P);
P5[1]:=5;
FOR I:=2 TO 12 DO P5[I]:=P5[I-1]*5; {P5[i]= 5^i, i=1..12.}
NR0:=0; {NR0= nr. cifrelor de zero de la finalul lui N factorial!}
IF (P=0) THEN N:=1
ELSE BEGIN
{#1. Se poate demonstra ca N>4*P, si ca N este multiplu de 5.}
N:= (4*P) + 5 - ((4*P) MOD 5);
{#2. Se poate arata ca, daca exista N, atunci are loc relatia:
P= [N/5] + [N/(5^2)] + [N/(5^3)] + ... + [N/(5^12)],
unde [x] este "partea intreaga" a lui x.
Folosind inegalitatea partii intregi: x-1 < [x] <= x,
si suma unor termeni in progresie geometrica,
se poate demonstra inegalitatea de la pasul #1.}
FOR I:=1 TO 12 DO
NR0:= NR0 + (N DIV P5[I]);
END;
WHILE (NR0<P) DO BEGIN
N:=N+5;
NR0:= NR0 + NR_FACT_5(N);
{OBS.: Cifrele de zero de la sfarsitul lui N! provin din
perechi de factori de 2 si 5. Cum factorii de 2 sunt mai
multi decat factorii de 5, este suficient sa numaram factorii
de 5 ce apar in descompunerea in factori primi pentru
fiecare factor din calculul lui N!=1*2*3*...*N.}
END;
IF (NR0=P) THEN WRITE(G,N)
ELSE WRITE(G,-1);
CLOSE(F); CLOSE(G);
END.