求N的阶乘中末尾0的个数

计算N的阶乘末尾0的个数

1.常规思路

求阶乘再统计0的个数

import java.util.Scanner;

//输入一个n,求n!末尾有几个0
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        long sum = 1;
        while (num > 1){
            sum *= num;
            num--;
        }
        int count = 0;
        while (sum % 10 == 0){
            count++;
            sum = sum / 10;
        }
        System.out.println(count);
    }

}

这个思路时一个正常思路,很朴素,但是有很多问题:

1、计算阶乘的开销大
2、会溢出long类型数据的最大值
3、效率底
2.科学思路

我们以125为例子来分析;125的阶乘为

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15…125

当1乘到5会产生一个0;

当1乘到10会产生两个0;

当1乘到15会产生三个0…

我们不难看出每间隔5个数会产生一个0把这些数字抽取出来是:

...、5、...、10、...、15、...、20、...、25、...

这些数字其实是都能满足5*k的数字,是5的倍数。统计一下他们的数量:n1=N/5

2、将1中的这些数字化成5*(1、2、3、4、5、...)的形式,内部的1、2、3、4、5、...又满足上面的分析:每5个数字有一个是5的倍数。抽取为:

...、25、...、50、...、75、...、100、...、125、...

在这里插入图片描述

import java.util.Scanner;

//输入一个n,求n!末尾有几个0

//n能被5(5^1)整除的提供1个0
//n能被25(5^2)整除的提供2个0
//n能被125(5^3)整除的提供3个0
//n能被625(5^4)整除的提供4个0
//所以 结果= n/5 + n/25 + n/125 + n/625
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int count = 0;
        while (num > 0){
            count += num / 5;
            num = num / 5;
        }
        System.out.println(count);
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值