问题描述:
满足N!的末尾恰好有K个 0 的最小的N是多少?
如果这样的N不存在输出-1 。
输入格式:
一个整数K。
输出格式:
一个整数代表答案。
输入样例:
2
样例输出:
10
评测用例规模与约定:
对于30%的数据,1<=K<=10^6
对于100%的数据,1<=K<=10^18
时间限制:
时间限制: 1.0s 内存限制: 512.0MB
解题思路:
值得注意K值10^18是比int的范围要大,long的范围刚好。
显然求n!的阶层再数末尾0是可以排除了数据太大了,那么最优解题思路的核心思想的原理来自于上一篇文章:阶层末尾零的个数
还有就是一位大哥的二分查找思想对我颇有震撼。
唯一的缺点就是要知道10^18所对应的阶层值。
理论成立代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();
long left = 5;//一个零
long right = 4000000000000000020L;//10^18个0
while(left <= right)//二分查找
{
long middle = ((right - left) >> 1) + left;//防止超出long的范围。>>1高效除以二
long zeronumber = zero(middle);
if(zeronumber > k)
{
right = middle - 1;
}
else if(zeronumber < k)
{
left = middle + 1;
}
else
{
while(middle%5 != 0)//防止得到的middle不是最小值
{
middle--;
}
System.out.print(middle);
return;
}
}
System.out.print(-1);
}
public static long zero(long n)//核心思想不变
{
long number = 0;
while(n > 0)
{
n = n/5;
number = number + n;
}
return number;
}
}