GESP 二级 · GESP 202412 C++ 二级 第 12 题

选择题 · 答案 D

← 整套速查表 GESP 二级 全部真题

题目

在数学中 $N!$ 表示 $N$ 的阶乘,即 $1$ 到 $N$ 的乘积,如 $3! = 1*2*3$。下面的 C++ 用于求 $1$-$N$ 的阶乘之和,如 $N$ 为 $3$,则是 $1! + 2! + 3!$。下面代码段补充选项后用于实现上述功能,其中不能实现阶乘和的选项是( )。

int N;
cin >> N;

int tnt = 0, nowNum = 1; // tnt 保存求和之值,当前 N 的阶乘

for (int i = 1; i < N + 1; i++) {
    ____________ // 基于上一个计算出当前数的阶乘
    ____________ // 从 1 到 i 每个数阶乘之和
}
cout << tnt;

A.

nowNum *= i;
tnt += nowNum;

B.

nowNum = nowNum * i;
tnt = tnt + nowNum;

C.

nowNum *= i;
tnt = nowNum + tnt;

D.

nowNum = nowNum + i;
tnt *= nowNum;
答案:D

解题思维

答案D。for循环每次迭代后执行更新表达式(如i++)。循环体执行次数由初始值、条件和更新共同决定。

常见错误

循环变量的初值、终值和步长共同决定循环次数。for(i=0;i<n;i++)执行n次。

详细解析(节选)

1. 🎯 考纲定位(考点定位)

GESP 二级(信息学基础)|递推算法|累加器设计

命题人把这道题塞进来,就是卡住那些只会背"阶乘=连乘"结论、却不懂代码里乘法与加法操作对象区别的考生。C++二级大纲明确指出阶乘计算要用递推,但递推时更新当前值与累加值是两个独立动作,很多考生会把两者混淆。

2. 🧠 解题思维(拆解与通法)

看到"阶乘和"先想:阶乘本身是乘积,求和是加法。递推里 nowNum 存的是当前 i 的阶乘,必须用乘法更新:nowNum *= i。tnt 存的是 1 到 i 的累加,必须用加法更新:tnt += nowNum。

通法提炼:阶乘/连乘类问题先乘后加,幂运算同理(如 2^i 先乘再累加)。循环内两个空,第一个负责更新当前值,第二个负责更新累计值,顺序固定:先算出当前数,再加进总和。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断