#P3664. 第1题-阶乘十进制
-
1000ms
Tried: 66
Accepted: 30
Difficulty: 3
所属公司 :
科大讯飞
时间 :2025年9月13日
-
算法标签>模拟
第1题-阶乘十进制
思路
这个问题的核心是计算一个整数中特定数字的出现次数。
-
分析约束条件:题目给出的输入范围是 1≤n≤15。这是一个非常关键的条件。我们来估算一下最大阶乘的值:15! 约等于 1.3×1012。这个数值在一个标准的64位整型(在C++中是
long long,在Java中是long)的表示范围内(大约是 9×1018)。因此,我们可以直接计算出 n! 的精确值,而不用担心数据溢出。 -
算法步骤:
-
第一步:计算阶乘。 我们可以使用一个循环,从 1 乘到 n,来计算 n! 的值。需要注意使用一个足够大的数据类型来存储结果,例如
long long。 factorial = 1×2×3×⋯×n -
第二步:统计数字 '0' 的个数。 在得到阶乘的具体数值后,问题就变成了“如何统计一个整数中 '0' 的个数”。这里有两种常用方法:
-
方法一(数学方法):通过模运算(
%)和除法运算(/)来逐位检查。- 初始化一个计数器
zero_count为 0。 - 当阶乘结果
factorial大于 0 时,进入循环。 - 在循环中,用
factorial % 10取得该数的个位数。 - 如果个位数是 0,则
zero_count加一。 - 用
factorial = factorial / 10来“去掉”个位数。 - 重复此过程,直到
factorial变为 0。
- 初始化一个计数器
-
方法二(字符串方法):将计算出的阶乘结果转换为字符串,然后遍历字符串,统计字符 '0' 的数量。这种方法在某些语言(如Python)中实现起来非常简洁。
-
-
C++
#include <iostream>
int main() {
// 读取输入 n
int n;
std::cin >> n;
// 步骤1: 计算 n!
// 由于 n 最大为 15,15! 约为 1.3e12,超过了 int 的范围,
// 但在 long long (64位整型) 的范围内。
long long factorial = 1;
for (int i = 1; i <= n; ++i) {
factorial *= i;
}
// 步骤2: 计算阶乘结果中 '0' 的数量
int zero_count = 0;
// 特殊情况:如果 factorial 本身是 0(本题不会发生),则包含一个 '0'。
if (factorial == 0) {
zero_count = 1;
} else {
// 使用模10和除10的方法,从个位开始逐位检查
long long temp = factorial;
while (temp > 0) {
// 如果当前最低位是 0,计数器加一
if (temp % 10 == 0) {
zero_count++;
}
// 去掉当前最低位,继续检查下一位
temp /= 10;
}
}
// 输出结果
std::cout << zero_count << std::endl;
return 0;
}
Python
# 导入 math 模块以使用 factorial 函数
import math
def count_zeros_in_factorial():
# 读取输入 n
try:
n = int(input())
except (ValueError, EOFError):
return
# 步骤1: 计算 n!
# Python的 math.factorial 函数可以直接计算阶乘,且内置支持大整数,无需担心溢出。
factorial_result = math.factorial(n)
# 步骤2: 将结果转换为字符串,并统计 '0' 的数量
# str() 函数将数字转换为字符串
# .count('0') 方法可以直接统计字符串中 '0' 字符的出现次数
zero_count = str(factorial_result).count('0')
# 输出结果
print(zero_count)
if __name__ == "__main__":
count_zeros_in_factorial()
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入 n
int n = scanner.nextInt();
// 步骤1: 计算 n!
// 由于 n 最大为 15,15! 约为 1.3e12,需要使用 long 类型来存储
long factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
}
// 步骤2: 计算阶乘结果中 '0' 的数量
int zeroCount = 0;
// 特殊情况:如果 factorial 本身是 0(本题不会发生),则包含一个 '0'。
if (factorial == 0) {
zeroCount = 1;
} else {
// 使用模10和除10的方法,从个位开始逐位检查
long temp = factorial;
while (temp > 0) {
// 如果当前最低位是 0,计数器加一
if (temp % 10 == 0) {
zeroCount++;
}
// 去掉当前最低位,继续检查下一位
temp /= 10;
}
}
// 输出结果
System.out.println(zeroCount);
scanner.close();
}
}
题目内容
小红想知道,n 的阶乘十进制表示总共有多少数字 ′0′ ?
输入描述
一个正整数 n 。
1≤n≤15
输出描述
n 的阶乘包含 ’0′ 的数量。
样例1
输入
7
输出
2
说明
7 的阶乘是 5040 ,其中有 2 个数字 ′0′