Question 17
修改循环条件后的影响
若将 `isPrime` 函数中的循环条件改为 `i <= n / 2`,输入 20 时,`countPrimes(20)` 的输出将变为 6。
正确答案
×
一句话考点
把循环上界从平方根改到 n/2 会变慢,但不会改变素数判断结果。
Shared Context
阅读程序(1)素数统计
这一组程序围绕素数判断函数展开,分别统计素数个数和素数和。
核心算法
试除法判断素数,只需要枚举到 sqrt(n)。
高频陷阱
把循环条件改成 `i <= n` 会让所有大于 1 的数都被判成非素数。
题型定位
属于“读懂函数职责 + 模拟几个样例”的标准阅读程序题。
cpp
共享程序片段#include <iostream>
using namespace std;
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
int countPrimes(int n) {
int count = 0;
for (int i = 2; i <= n; i++) {
if (isPrime(i)) {
count++;
}
}
return count;
}
int sumPrimes(int n) {
int sum = 0;
for (int i = 2; i <= n; i++) {
if (isPrime(i)) {
sum += i;
}
}
return sum;
}
int main() {
int x;
cin >> x;
cout << countPrimes(x) << " " << sumPrimes(x) << endl;
return 0;
}题组阅读提醒
程序先定义 `isPrime` 判断某个整数是不是素数,再通过 `countPrimes` 与 `sumPrimes` 分别统计 2 到 n 的素数个数和素数和。
关键观察点有两个:一是 `i * i <= n` 代表只需枚举到平方根;二是两个统计函数都采用从 2 到 n 的线性扫描,因此输出是“包含 n 在内”的统计结果。
Prompt
题目与选项
若将 `isPrime` 函数中的循环条件改为 `i <= n / 2`,输入 20 时,`countPrimes(20)` 的输出将变为 6。
Quick Check
做题抓手
先判断题型
先确认陈述是在描述函数职责、输出值还是程序修改后的影响。
再核对边界
第一轮很爱在闭区间、下标偏移、递归终止条件和布尔返回值上设陷阱。
最后看输出层次
尤其是阅读程序题,要分清函数返回值、变量值和最终打印值是不是同一件事。
Explanation
详细讲解
Step 1
原程序用 `i * i <= n` 是为了优化枚举范围,只检查到平方根即可。
Step 2
如果改成 `i <= n / 2`,仍然会检查所有可能的真因子,因此逻辑上依旧能正确判断素数,只是效率更低。
Step 3
20 以内素数仍然是 2、3、5、7、11、13、17、19,共 8 个,不会变成 6,所以该说法错误,应填 `×`。
Pitfalls
易错点
- 看到循环条件变化,就误以为答案一定会变。
- 把 20 以内素数个数数错,漏掉 17、19 等后面的素数。
Extend
拓展补充
- 试除法只要检查到平方根就足够,因为若 `n = a * b` 且 `a > sqrt(n)`,则必有 `b < sqrt(n)`。
返回总览
回到整套试卷
返回题目总览页,继续从目录、知识图谱或其他分区进入。
所属分区
返回 阅读程序
回到首页对应分区,继续顺序刷题或查看同类知识点。
上一题
第 16 题
输入 10 时的输出判断
下一题
第 18 题
sumPrimes 的功能判断