该代码是求解输入一个n(0<n<=10^18),求满足K!后面有n个0,输出满足条件的最小的K,若不存在则输出-1
我的思路是用二分法在【0,4^19】范围里查找符合该条件的数(4^19!后面有1e+18个零,满足题目要求)
但输出一直都是-1
#include<iostream>
#include<math.h>
using namespace std;
int ling(long double g);
int main()//通过二分法来寻找尾数中有m个0的数
{
long double n;
cin>>n;
long double r=0,l=pow(4,19),mid;
long double d;
while(r<=l)
{
mid=(r+l)/2;
d=ling(mid);
if (n <= d)
{
l = mid - 1;
}
else if(n > d)
{
r = mid + 1;
}
else
{
r = mid;
}
}
if(ling(r)!=n)
{
cout<<"-1"<<endl;
}
else
{
cout<<r<<endl;
}
return 0;
}
int ling(long double g)//求多少个0
{
long double ans=0;
//Z = N/5 + N /(5*5) + N/(5*5*5)…..直到N/(5的K次方)等于0
//公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再贡献一个5
while(g)
{
ans += floor(g/5);
g = floor(g/5);
}
return ans;
}
例如输入2,此时应该输出10,但一直都是输出-1
单独运行求N!后面有几个0的部分没有问题,而二分法应该也没有错误
25=10;
计算2^p5^q 也就是说计算min(p,q) <=n