GESP 二级 · GESP202609 C++ 二级 第 25 题

判断题 · 答案 B · 考点:函数

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

题目

如果 N 和 M 均为整数,下列 C++ 代码则可以判断正整数 N 是 M 的平方。比如 9 是 3 的平方。

int N, M;

cout << "请输入正整数N:";

cin >> N;

cout << "请输入整数M:";

cin >> M;
if (int(sqrt(N)) == abs(M))

printf("%d是%d的平方\n", N, M);

答案:B

考点

函数

解题思维

看到题先想"sqrt 返回 double,int 强转会截断小数"。关键观察是"N 不是完全平方数时,int(sqrt(N)) 会变小"。推理依据是浮点数精度特性。通法是:先判断 sqrt(N) 是否接近整数,再比较。这一类题的陷阱永远是"截断误差"。

常见错误

A 选项看似正确,实则利用"截断误差"陷阱:N=10 时 sqrt(10)≈3.162,int(3.162)=3,abs(3)=3,3==3 成立,输出"10 是 3 的平方",但 10 根本不是 3 的平方。命题人故意用非完全平方数测试精度丢失。B 选项错误,因为代码逻辑有缺陷,不能正确判断平方关系。

详细解析(节选)

1. 考纲定位

本题考查 GESP 二级 C++ 大纲中的"浮点数精度与类型转换"、"绝对值函数"、"平方根函数"。命题人卡住的是"类型转换精度丢失"这个弱点——绝大多数考生会忽略 int 强转 double 时的截断行为,误以为 sqrt(N) 能精确判断完全平方数。

2. 解题思维

看到题先想"sqrt 返回 double,int 强转会截断小数"。关键观察是"N 不是完全平方数时,int(sqrt(N)) 会变小"。推理依据是浮点数精度特性。通法是:先判断 sqrt(N) 是否接近整数,再比较。这一类题的陷阱永远是"截断误差"。

同考点真题

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