题目
从标准输入读入非负整数 n,分别演示两种计算阶乘 $n!$ 的方法:使用传统 <code>for</code> 循环相乘累乘,以及调用内置向量乘积函数 <code>prod(1:n)</code>;特别处理 $0! = 1$ 的数学边界。
输入格式:一行输入一个非负整数 n。
输出格式:输出阶乘数值及两种方法的验算对比。
数据范围与约定:0 ≤ n ≤ 20(避免双精度浮点整型溢出)。
思路与算法
1. 0 的阶乘数学定义
数学上 $0! = 1$。循环设计时累乘器初值设为 1,若 $n=0$ 则循环 1:0 为空序列不执行,自然保留 1,符合定义。
2. prod 向量化函数prod(1:n) 对向量所有元素求连乘积。如果输入为空矩阵(如 $n=0$ 时的 1:0),prod 默认返回乘法单位元 1,天然优雅兼容。
3. 数值精度上限
标准双精度能严格无损表示整数的上限是 $2^{53}-1$(约 $9 \times 10^{15}$),当 $n > 21$ 时 $n!$ 会发生精度损失,超过 170 时溢出为 Inf。
完整程序
% Octave / MATLAB 第52题:阶乘计算对比
[n, count] = scanf("%d", 1);
if count < 1 || n < 0
fprintf("错误:请输入非负整数。\n");
return;
end
if n > 21
fprintf("警告:n = %d 时阶乘可能超出双精度无损整数范围。\n", n);
end
% 方法 1:for 循环累乘
fact_loop = 1;
for k = 1:n
fact_loop = fact_loop * k;
end
% 方法 2:prod 向量化
fact_prod = prod(1:n);
fprintf("%d! (循环求得) = %.0f\n", n, fact_loop);
fprintf("%d! (prod 求得) = %.0f\n", n, fact_prod);运行示例
示例 1:
输入:
5输出:
5! (循环求得) = 120
5! (prod 求得) = 120示例 2:
输入:
0输出:
0! (循环求得) = 1
0! (prod 求得) = 1示例 3:
输入:
10输出:
10! (循环求得) = 3628800
10! (prod 求得) = 3628800