请问以下循环程序的输出结果是多少( )。
int s = 1;
for (int i = 1; i <= 10; i *= 3) {
s *= i;
}
cout << s << endl这题别急着套公式,直接拿草稿纸模拟一遍循环!关键是看清 i 的更新规则是 i*=3,不是 i++,还有循环条件 i<=10 什么时候会假。
最容易栽跟头的是把 i 的更新当成 i++,那样循环会跑10次,结果算成10!。还有的同学看到 i*=3 以为能一直乘到 3^4=81,忘了 81 已经大于 10 了,循环早就停了。另外,很多人会忽略 s 的初始值是 1,以为是从 0 开始乘,那结果就是 0 了。
这道题考的是程序阅读能力,核心就是模拟循环执行过程,跟踪变量 s 和 i 的值变化。命题人喜欢在这种基础题里挖坑,比如把循环变量更新写成乘法而不是加法,或者设置一个看起来能跑很多次但实际上很快终止的循环条件,诱导学生用数学公式硬算而不是老老实实模拟。
拿到这种题,心法就一条:别想太复杂,把变量值写下来,一行一行过。
咱们来模拟一下。程序开始前,s 被赋值为 1。然后进入 for 循环,初始值 i=1。 第一次循环:i=1,满足 i<=10,执行 s *= i,也就是 s = 1 * 1 = 1。执行完循环体后,更新 i *= 3,i 变成 3。 第二次循环:i=3,满足 i<=10,执行 s *= i,也就是 s = 1 * 3 = 3。更新 i *= 3,i 变成 9。 第三次循环:i=9,满足 i<=10,执行 s *= i,也就是 s = 3 * 9 = 27。更新 i *= 3,i 变成 27。 第四次循环:i=27,不满足 i<=10,循环结束。
所以最终输出 s 的值是 27,对应选项 A。
这里有个细节,很多学生看到 i*=3 会下意识地觉得 i 会取 1, 3, 9, 27, 81...,然后脑子里想着是不是要算到 81 为止,或者想能不能用等比数列求和公式。这就是命题人设的坑。实际上,只要 i 超过 10,循环就停了,根本不会跑到 81。所以千万别用数学公式去凑,老老实实模拟最稳妥。
再说说易错点。首先,s 的初始值是 1,这是一个乘法单位元,乘了它值不变,但很多同学会忽略这一点,以为是从 0 开始乘,结果算成 0。其次,循环变量 i 的更新是乘法,不是加法,这会导致 i 的增长速度非常快,1, 3, 9, 27,一下子就从 10 跳出去了。如果误以为是 i++,那循环就会执行 10 次,s 就会变成 10!,那就选错答案了。
关于考频和趋势,根据历年真题数据,"程序阅读与变量跟踪"是 CSP-J/S 和 GESP 中高频考点,尤其在选择题和填空题中占比很高。这类题目通常不考复杂的算法,而是考对基本语法和逻辑的理解,比如循环条件、变量更新、运算符优先级等。从近五年数据看,这类题目的难度相对稳定,但命题人喜欢在细节上挖坑,比如把循环变量更新写成乘法,或者设置一个看起来能跑很多次但实际上很快终止的循环条件。
预测未来,这类题目依然会保持高频,但可能会在细节上更加隐蔽,比如把循环变量更新写成 i *= 2 或者 i *= 5,或者把循环条件写成 i < 10 而不是 i <= 10。不过,只要掌握了模拟循环的基本方法,这类题目就不难应对。