如果 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);
看到题先想"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 选项错误,因为代码逻辑有缺陷,不能正确判断平方关系。
本题考查 GESP 二级 C++ 大纲中的"浮点数精度与类型转换"、"绝对值函数"、"平方根函数"。命题人卡住的是"类型转换精度丢失"这个弱点——绝大多数考生会忽略 int 强转 double 时的截断行为,误以为 sqrt(N) 能精确判断完全平方数。
看到题先想"sqrt 返回 double,int 强转会截断小数"。关键观察是"N 不是完全平方数时,int(sqrt(N)) 会变小"。推理依据是浮点数精度特性。通法是:先判断 sqrt(N) 是否接近整数,再比较。这一类题的陷阱永远是"截断误差"。