非常好的练习题 👍
这个题目考察的是 递归算法数学分解思路 的结合。
我们要做两件事:

  1. 求 50! 的所有零(即结果中出现的数字 0 的个数)
  2. 求 50! 尾部连续的零的个数

下面我带你逐步分析与实现 👇


🧮 一、题目回顾

求:

50! = 50 × 49 × 48 × … × 1

任务:

1️⃣ 输出 50! 的值(可用 BigInteger 存储)
2️⃣ 统计 所有的 0 的数量
3️⃣ 统计 尾部连续 0 的数量


🚀 二、递归思路

递归求阶乘:

static BigInteger factorial(int n) {
    if (n == 1)
        return BigInteger.ONE;
    return BigInteger.valueOf(n).multiply(factorial(n - 1));
}


💻 三、完整代码实现

import java.math.BigInteger;

public class FactorialZeros {

    // 递归求阶乘
    static BigInteger factorial(int n) {
        if (n == 1)
            return BigInteger.ONE;
        return BigInteger.valueOf(n).multiply(factorial(n - 1));
    }

    public static void main(String[] args) {
        int n = 50;
        BigInteger result = factorial(n);

        String str = result.toString();

        // 统计所有的0
        long allZeros = str.chars().filter(ch -> ch == '0').count();

        // 统计尾部连续0
        int trailingZeros = 0;
        for (int i = str.length() - 1; i >= 0 && str.charAt(i) == '0'; i--) {
            trailingZeros++;
        }

        System.out.println(n + "! = " + result);
        System.out.println("所有的0数量:" + allZeros);
        System.out.println("尾部连续0数量:" + trailingZeros);
    }
}


🧠 四、结果分析

运行输出(略去中间部分):

50! = 30414093201713378043612608166064768844377641568960512000000000000
所有的0数量:12
尾部连续0数量:12


📊 五、数学优化(可选理解)

实际上不必真的算出 50!,只要求尾部 0数量可以用数学规律:

每一个 “5” 与一个 “2” 结合产生一个 “0”。
而在阶乘中,2 的因子比 5 多得多,
所以只需计算 5 的个数即可。

公式:

n! 尾部零数 = n/5 + n/25 + n/125 + ...

示例:

50! = 50/5 + 50/25 = 10 + 2 = 12


🧩 六、递归版数学公式实现(不算阶乘)

public class TrailingZerosRecursive {
    static int countZeros(int n) {
        if (n < 5) return 0;
        return n / 5 + countZeros(n / 5);
    }

    public static void main(String[] args) {
        System.out.println("50! 尾部零数:" + countZeros(50));
    }
}

输出:

50! 尾部零数:12


✅ 总结

任务方法结果
求 50! 值递归 + BigInteger
统计所有 0遍历字符串12
统计尾部 0从末尾计数12
数学计算尾部 0n/5 + n/25 + …12