一个数如果能被某个数(比如 7)整除,或者含有该数,则说该数是某个数的相关数。下面 C++ 代码用于判定输入的数与 7 是否有关。下列说法错误的是( )。
int N, M;
bool Flag = false;
cin >> N;
M = N;
if (M % 7 == 0)
Flag = true;
while (!Flag && M) {
if (M % 10 == 7) {
Flag = true;
break;
}
M /= 10;
}
if (Flag)
cout << N << "与7有关";
else
cout << N << "与7无关";答案A。if-else语句中else与最近的if配对。花括号可以改变匹配关系。
if(a=b)合法但往往不是本意!它执行赋值后判断b的值是否为0。
【考点】循环控制|取整除|条件判断
考纲定位:GESP二级循环与运算模块。命题人用"能否被7整除或含7"这一双重判定,卡住考生对循环终止条件的理解——很多人误以为只要遇到7就立刻结束,却忽略了while条件里的M,导致对break作用认知偏差。
解题思维:代码先判整除,再逐位检查。while(!Flag&&M)确保M归零才退出,删除M/=10会让M停在7,M%10永远为7,死循环;删除break后M仍会逐位右移,循环在M=0时终止,但Flag可能在后续位才置1,结果可能出错。把M换成N同样可行,因为N已存原数,直接修改N不影响逻辑。
陷阱拆解:A选项最阴险——"不会死循环"正确,但"有时结果错误"才是考点。命题人利用学生"break=提前结束"的直觉,以为删掉break就永远循环;实则while条件已含M,必会退出。C选项看似无关,实则考察变量作用域与初始值,删M=N后直接改N,逻辑完全等价。
反命题思维:若改判7为2,代码同样成立;若删M%10==7,则只判整除。刷到类似题,先问自己:循环何时必停?Flag何时置1?M/=10是逐位提取,break是提前收队,二者缺一不可。