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

全部评论

相关推荐

07-09 19:25
门头沟学院 Java
这是要把每一个投校招的都开盒吗?
码农索隆:隐私这一块,直接是毫无隐藏😅
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
05-14 20:34
门头沟学院 Java
窝补药贝八股:管他们,乱说,反正又不去,直接说680
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:02
ssob上原来真有BOSS啊
硫蛋蛋:这种也是打工的,只不是是给写字楼房东打工
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务