说实话真不会写,确实百度了。 百度的方法是这样的。
public class Main{
public static int test(int n){
if(n < 0){
return 0;
}
int res = 0;
while (n !=0){
res += n /5;
n = n/5;
}
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
System.out.println( test(in.nextInt()));
}
}
}
这种方法,说实话,我真的是想不到的,看的时候,也看不太明白,什么什么因子,啥是因子啊?实在看不明白,只能死记硬背了。
蠢人按照蠢人的思路来,先算出阶乘的积,然后再计算后面的 0 的个数,于是有了这种方法
import java.util.Scanner;
/**
* 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2
* @Author luke Lu
* @Date 2022/5/12 17:04
*
*/
public class Demo0001 {
// 1.实现一个整数的阶乘 n! 并返回结果
public static int factorial(int num){
if (num <= 0) {
System.out.println("有问题");
return -1;
}
int sum = 1;
for (int i = 1; i <= num; i++) {
sum = i*sum;
}
return sum;
}
// 2.从后遍历这个结果,是 0 就计数 1,遍历不到 0 了,就停止遍历。
/*
* 遍历一个数字,得到最后一个数字是不是0
* 思路:
* 1.一个数字取模 10,就可以得到当前数字的最后一位数字
* 2.一个数字除以 10,就可以得到一个数字去掉最后一位数字之后前面剩余的数字
*/
public static int getTrailingZeroNum(int num){
if (num <= 0) {
System.out.println("有麻烦啊");
return -1;
}
int count = 0;
while (num != 0) {
int val = num % 10;
if (val == 0) {
count ++;
}
num = num/10;
}
return count;
}
public static int trailingZero(int n){
int result = 0;
while (n/5>0){
result = result+n/5;
n = n/5;
}
return result;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
System.out.println( getTrailingZeroNum(factorial(in.nextInt())));
}
}
}
终于知道 为什么先计算阶乘在遍历求最后有几个 0 的不行了,因为 当阶乘到17 的时候,得到的值就超出了 int 的最大取值范围,值就变成了负数了。变成负数之后,就没办法计算了,但是负数也可以有0啊,有就接着把 负数的0 的个数给算出来,反正要的是数字后面的 0 的数量。为什么不可以这样算呢?因为,阶乘超出 int 的范围后得到负数后面的 0 跟实际得到的0的数量是不一样的。这就是 不能用下面这种方法的原因。