GESP 二级 · GESP 202409 C++ 二级 第 15 题

选择题 · 答案 A · 考点:循环控制

← 整套速查表 GESP 二级 全部真题

题目

一个数如果能被某个数(比如 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

考点

循环控制

解题思维

答案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是提前收队,二者缺一不可。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断