在数学中 $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。for循环每次迭代后执行更新表达式(如i++)。循环体执行次数由初始值、条件和更新共同决定。
循环变量的初值、终值和步长共同决定循环次数。for(i=0;i<n;i++)执行n次。
GESP 二级(信息学基础)|递推算法|累加器设计
命题人把这道题塞进来,就是卡住那些只会背"阶乘=连乘"结论、却不懂代码里乘法与加法操作对象区别的考生。C++二级大纲明确指出阶乘计算要用递推,但递推时更新当前值与累加值是两个独立动作,很多考生会把两者混淆。
看到"阶乘和"先想:阶乘本身是乘积,求和是加法。递推里 nowNum 存的是当前 i 的阶乘,必须用乘法更新:nowNum *= i。tnt 存的是 1 到 i 的累加,必须用加法更新:tnt += nowNum。
通法提炼:阶乘/连乘类问题先乘后加,幂运算同理(如 2^i 先乘再累加)。循环内两个空,第一个负责更新当前值,第二个负责更新累计值,顺序固定:先算出当前数,再加进总和。