下面 C++ 代码执行后的输出是( )。
int N = 9;
for (int i = 2; i < N; i++)
if (N % i)
cout << "1#";
cout << "0" << endl;这道题考循环边界与非零判断。别急着看取模结果,先盯住循环条件i<N,N=9时i只到8,然后逐次验证if(N%i)的真假,非零才输出。
最容易掉进两个坑:一是把if(N%i)脑补成'判断i是不是因子',以为只有i=3时输出,其实非零才满足if;二是循环边界,很多人下意识觉得要除到N本身,但i<N把i=9挡在外面。若误以为i能取到9,末尾就会多一次'0',直接选错。
【考点】循环结构边界控制|取模运算真假条件|程序逐行追踪
命题人这次挖的坑很典型:把'非因子'直接写成if(N%i),二级考生常背'因子判断用取模',一看到N%i就下意识想'除以3余0',完全忽略了if里要的是非零才成立。再加上循环条件i<N,很多人会惯性认为'求因子要除到N',结果把i=9漏掉或误加。这道题就是把这两个反直觉点串在一起,让你一步步追踪输出。
拿到题先想什么?先看N=9,循环变量i从2开始,条件i<N意味着i最大取到8,9根本进不来。然后看if(N%i):只要9除以i余数不为0,条件就为真,输出1#;余数为0则跳过。所以我们要把i=2到8逐次代入,看哪些能整除9。
逐行推演: i=2:9%2=1≠0 → if成立 → 输出1# i=3:9%3=0 → if不成立 → 不输出 i=4:9%4=1≠0 → 输出1# i=5:9%5=4≠0 → 输出1# i=6:9%6=3≠0 → 输出1# i=7:9%7=2≠0 → 输出1# i=8:9%8=1≠0 → 输出1# 循环结束,执行cout<<"0"<<endl,固定输出0。
所以总共输出6次1#,后面紧跟0,答案D。
避坑提醒: 1) if(N%i)千万别读成'判断i是否为因子',它实际是'判断i是否不是因子'。只有i=3时不输出,其余都输出。 2) 循环边界i<N,i=9永远不会进入循环体,末尾的0是循环外写的,不是循环里算出来的。 3) 若误以为i能到9,会多一次判断:9%9=0,if不成立,不会输出1#,反而可能让人误以为末尾0来自循环内,逻辑全乱。
考频与趋势:
预测:
总结:这道题的核心就是'逐次代入循环值,看if条件真假',边界i<N和if(N%i)的非零逻辑必须同时盯住,任何一个看错都会选错。刷到这类题,先列i的取值范围,再一个个验算取模结果,最后看循环外有没有固定输出,就能稳稳拿下。