题解 | #末尾0的个数#

末尾0的个数

http://www.nowcoder.com/practice/6ffdd7e4197c403e88c6a8aa3e7a332a

说实话真不会写,确实百度了。 百度的方法是这样的。

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的数量是不一样的。这就是 不能用下面这种方法的原因。

全部评论

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务