问题描述
满足 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可以用:
int count=0;
while(n>0)
{n=n/5;count+=n;}
return count;
来实现。
求阶乘这道算法题的思路为,根据给出的用例范围,进行二分查找,代入上述方法里。
其中9e18代表9*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();//末位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;}
}