下面 C++ 代码执行后,将输出 $5$。( )
int cnt = 0;
for (int i = 1; i < 5; i++)
for (int j = i; j < 5; j += i)
if (i * j % 2 == 0)
cnt += 1;
cout << cnt;答案A。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】循环结构(嵌套循环)|条件判断|取模运算
解析:外层循环 i 从 1 遍历到 4,内层循环 j 从 i 开始,步长为 i,直到小于 5。当 i=1 时,j=1,2,3,4,i*j 分别为 1,2,3,4,其中偶数有 2 个(2,4),cnt 加 2;i=2 时,j=2,4,i*j 分别为 4,8,均为偶数,cnt 加 2;i=3 时,j=3,i*j=9 为奇数,cnt 不加;i=4 时,j=4,i*j=16 为偶数,cnt 加 1。总计 cnt=5,输出正确。
命题人陷阱:内层循环步长是 i 而非 1,导致 j 取值是 i 的倍数;条件判断的是乘积 i*j 的奇偶性,而非 i 或 j 本身。若误以为 j 每次加 1,会漏掉 j=4 的情况(如 i=2 时),导致 cnt 少 1。更隐蔽的是 i=3 时 j 只到 3,乘积为 9 是奇数,易被忽略。
反命题思维:若将内层循环改为 j+=1,或判断条件改为 i%2==0,答案都会不同。比如 j+=1 时 i=2 的 j 会多到 3,i*j 为 6 仍偶数,但 i=3 的 j=4 时 i*j=12 偶数,cnt 会变化。提示:遇到嵌套循环题,先明确循环变量更新规则,再逐层模拟,避免凭直觉跳步。