问题描述
满足 N!的末尾恰好有 区 个o的最小的 N 是多少?
如果这样的 N 不存在输出 -1。
输入格式
一个整数 区。
输出格式
一个整数代表答案。
样例输入
样例输出
10
评测用例规模与约定
对于 30% 的数据,1<K<106
对于 100% 的数据,1<K<1018
运行限制
最大运行时间:3s最大运行内存:512M
解题思路:计算阶乘末尾有多少个0,可以找到一定的规律,
|-----|-------|
| 数值 | 末尾多少0 |
| 10 | 2 |
| 20 | 4 |
| 30 | 6 |
| 100 | 24 |
| 200 | 49 |
可以看到末尾有多少0与5的倍数有关。
计算100末尾有多少0:
100/5=20
20/5=4
20+4=4
计算200末尾有多少0:
200/5=40
40/5=8
8/5=1
40+8+1=49
所以计算阶乘末尾有多少0可以用:
java
int count=0;
while(n>0)
{
n=n/5;
count+=n;
}
return count;
来实现。
求阶乘这道算法题的思路为,根据给出的用例范围,进行二分查找,代入上述方法里。
其中9e18代表9*10的18次方
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long k = sc.nextLong();//末位0的个数
long l = 1;
long r = (long)9e18;
while (l < r) {//找符合条件的最小值
long mid =(l+r)/2;
if (getF(mid) >= k) {
r = mid;
} else {
l = mid + 1;
}
}
if (getF(r) == k) {
System.out.println(r);
} else {
System.out.println(-1);
}
}
public static long getF(long num) {
long ans = 0;
while (num > 0) {
ans += num / 5;
num /= 5;
}
return ans;
}
}