判断N!的末尾0的个数

该Java代码计算输入整数N的阶乘N!中0的个数。关键在于理解N!中的0是由10的因子决定的,而10=2*5。由于2的因子通常多于5,所以主要计算5的因子个数。程序通过n/5获取5的一次倍数的数量,从而估算0的总数。
摘要由CSDN通过智能技术生成
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int ans = 0;
        while (n != 0) {
            ans += n/=5;//*****一条语句计算0的个数
        }
        System.out.println(ans);
    }
}

这题怎么写?

首先我们如果知道N!由于10 = 2*5 所以N!其中2的次数和5的次数 那么这两者中最小的就是解 但是很难在一条语句循环求出来
最后发现 一定是5的次数小于2的次数 那么我们只需要计算出5的次数即可

开始想要每次在这个语句中N不断-1 然后求一下log5N 但是不好在一条语句中实现、

我们知道一个数必然等于2^a*3^b*5^c……
那么我们如果用n/5就可以知道n中有多少个5的倍数 可是这只是因子中有5^1的个数 我们需要再加上5^2的个数,那么因子中有5^1的数中必然有5^2的数 也就是两部分数字有交集 即解为N

N!=1*2*……*n
N!中0的个数取决与10的因子个数
N!中的10因子个数取决于min(2因子个数,5因子个数)
min(2因子个数,5因子个数)取决于5因子个数

N!中0的个数取决于5的个数

其中5的因子个数取决与有多少个5的一次倍数 5的二次倍数 5的三次倍数...5的n次倍数的加和(5^n<=N!)
即N!中存在 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值