题目来源
https://www.nowcoder.com/questionTerminal/6ffdd7e4197c403e88c6a8aa3e7a332a?toCommentId=1485652
题目描述
输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
-
输入描述:
输入为一行,n(1 ≤ n ≤ 1000) -
输出描述:
输出一个整数,即题目所求
示例1
输入
10
输出
2
解题思路
走的弯路:因为做题经验不够丰富,一开始的第一反应是 求阶乘,然后取模看0的个数,遇到非0的数直接跳出返回当前数到的0的个数
观察规律:
- 如果
n < 5
,那么它的阶乘末尾一定没有0。 - 如果
n = 5
,那么它的阶乘末尾有一个0。(5 * 4 * 3 * 2 * 1) - 如果
n <5 && n<= 10
,那么它的阶乘末尾有2个0。 - 如果
n <10 && n<= 15
,那么它的阶乘末尾有3个0。 - …依次类推
总结规律:假设给一个数n== 12
,它末尾0的共享其实来自于阶乘过程中的10
和2*5
.所以当我们拿到12,我们先用12%5
,如果取模结果不为0,则直接12--
.依次循环,减到10的时候拿到一个0,减到5的时候再拿到一个0。
思路可能有点混乱,还是直接上代码辅助理解!
实现代码
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //1.取到n
int count = 0; //2.记录末尾0的个数
//3.要n比5大,阶乘末尾才有0
for(int i = n;i >=5;i--) {
//如果在循环中要对控制循环的变量进行运算操作,最后产生它的副本,用副本操作,这样可以避免循环条件出问题。
int temp = i;
while(temp % 5 == 0) { //能走到这的都是5的倍数
count++;
temp /= 5;
}
}
System.out.println(count); //返回末尾0的个数
}
}