Question 34

② 的上界

在判断平方数程序中,② 处应填什么?

完善程序3难度 中等

正确答案

B. (int)floor(sqrt(num))

一句话考点

检查完全平方数时,枚举到 `floor(sqrt(num))` 就足够,而且不能少一位。

程序补全完全平方数

Shared Context

完善程序(1)判断平方数

补全一个判断完全平方数的函数,重点是循环边界、判定条件和布尔返回值。

算法思想

这是最直接的穷举法,虽然不是最优,但和题意完全一致。

判定边界

如果上界比 `sqrt(num)` 少 1,就会漏掉像 16、25 这样的完全平方数。

语法点

判断条件里一定要用 `==`,写成 `=` 会变成赋值,语义完全错误。

cpp

共享程序片段
#include <iostream>
#include <vector>
using namespace std;

bool isSquare(int num) {
  int i = ①;
  int bound = ②;
  for (; i <= bound; ++i) {
    if (③) {
      return ④;
    }
  }
  return ⑤;
}

int main() {
  int n;
  cin >> n;
  if (isSquare(n)) {
    cout << n << " is a square number" << endl;
  } else {
    cout << n << " is not a square number" << endl;
  }
  return 0;
}

题组阅读提醒

题目希望枚举正整数 x,判断是否存在 `x * x == n`。因此最自然的写法是从 1 开始,枚举到 `floor(sqrt(num))`。

只要在循环中发现平方刚好等于 num 就返回 `true`,枚举完仍没找到则返回 `false`。

本题属于第 完善程序 分区,题组覆盖题号: 33、34、35、36、37

Prompt

题目与选项

在判断平方数程序中,② 处应填什么?

A. (int)floor(sqrt(num)) - 1

B. (int)floor(sqrt(num))

C. floor(sqrt(num / 2)) - 1

D. floor(sqrt(num / 2))

Quick Check

做题抓手

先判断题型

先确定这行代码在整体算法中的职责,再看四个选项谁能完成这个职责。

再核对边界

第一轮很爱在闭区间、下标偏移、递归终止条件和布尔返回值上设陷阱。

最后看输出层次

尤其是阅读程序题,要分清函数返回值、变量值和最终打印值是不是同一件事。

Explanation

详细讲解

  1. Step 1

    如果 `i * i = num`,那么 i 最大只可能到 `sqrt(num)`,因此枚举上界取 `floor(sqrt(num))` 就已经覆盖所有候选值。

  2. Step 2

    不能减 1,因为当 `num = 16` 时,真正的平方根 4 就会被漏掉。

  3. Step 3

    `sqrt(num / 2)` 更没有依据,会把很多合法候选值排除在外,因此只有 B 正确。

Pitfalls

易错点

  • 看到 `floor` 就随手再减 1,导致正好漏掉平方根本身。
  • 误以为只要“差不多接近”就可以,把上界乱缩小。

Extend

拓展补充

  • 如果改用二分法判断完全平方数,上界同样常从 `sqrt` 或 num 本身出发。

返回总览

回到整套试卷

返回题目总览页,继续从目录、知识图谱或其他分区进入。

所属分区

返回 完善程序

回到首页对应分区,继续顺序刷题或查看同类知识点。

上一题

第 33 题

① 的起始值

下一题

第 35 题

③ 的判定条件