Pagini recente » Cod sursa (job #1837037) | Cod sursa (job #2218480) | Cod sursa (job #2628722) | Cod sursa (job #1711977) | Cod sursa (job #513371)
Cod sursa(job #513371)
//se da un numar intreg 0<=p<=100 milioane
//se cere cel mai mic numar intreg ptr care factorialul are fix p zerouri in coada
#include<fstream>
using namespace std;
int p;
//functie care intoarce fm lui 5 din desc in factori primi ai unui nr
int putere5(int n)
{
int contor=0;
while(n%5==0)
{
contor++;
n/=5;
}
return contor;
}
//de cate ori apare 5 in desc in factori primi ai lui n!
int putere5infact(int n)
{
//daca nu se divide la 5 patrat(25) atunci 5 apare o sg data, altfel se apeleaza functia putere5
int i,contor5=0;
//evident i merge din 5 in 5(doar astea se pot divide la 5)
for(i=5;i<=n;i+=5)
if(i%25!=0)
contor5+=1;
else
contor5+=putere5(i);
return contor5;
}
int main()
{
ifstream f("fact.in");
ofstream g("fact.out");
f>>p;
if(p==0)
{
g<<1;
return 0;
}
//cautare binara
// a=0 si b=10 milioane. daca nrzerodinfact((a+b)/2)<p tre sa caut in dreapta, altfel caut in stanga
//repet pana nrdezerodinfact=p sau a il depaseste pe b(in acest caz afisez -1)
int a=0,b=10000000,c,rez,gasit=0;
while(a<b && gasit==0)
{
c=(a+b)/2;
rez=putere5infact(c);
if(rez<p)
a=c+1;
else
if(rez>p)
b=c-1;
else
{
//nu stim daca nr gasit este cel mai mic, dar el oricum face parte dintr o multime cu maxim 5 elemente
//nr corect este si multiplu de 5
//impart nr la 5 si scad restul din el.Ex 13%5=3 deci nr minim va fi 13-3=10
c=c-c%5;
g<<c;
gasit=1;
}
}
if(gasit==0)
g<<-1;
return 0;
}