056 有关阶乘的两个问题1
Table of Contents

ac

给定一个非负整数N,返回N!结果的末尾为0的数量

每一对(2,5)就会产生一个0,将问题转换为:n!有多少对(2,5
进一步将问题简化为:n!拆分成的因子中有多少个5(为什么是5,不是2,是因为2出现的频率比5高)
出现5,一定能足够的2来配对,所以只需要知道1-nn个数中,含有多少个因子5
举例说明:
N=20Z=20/5 + 20/25 = 420/5可理解为20,15,10,5这四个数每个都提供了一个5
N=25Z=25/5 + 25/25 +25/125 = 625/5可理解为:25,20,15,10,5这五个数每个都提供了一个525/25可理解为:25 = 5*5,在25/5中提供了一个5,在25/25中又提供了一个5,即25提供了两个5
同样的125=5*5*5125可提供三个5
import java.util.*;


public class Main {

    public static Scanner sc = new Scanner(System.in);

    // 时间复杂度 O(logn)
    static long numOfZero(long n){
       long num = 0;
       long i = 5;
       while (n > 0){
           num += n / i;
           n = n / i;
       }
       return num;
    }

    public static void main(String[] args) {
        long n = sc.nextLong();
        System.out.println(numOfZero(n));
    }

}