B66
案例:质数、报数、永真循环求和
引入
章前总览 质数用 break 提前结束试除;用 flag 记状态;报数用 continue 跳过倍数;未知个数输入用 while(true) + break。
四块内容:
- 质数判定:i*i<=n + break
- 状态变量 flag
- 小杨报数:continue
- 读到 −1 结束:while(true)+break
1 案例1:质数的判定
输入 n(n≥2),是质数输出 yes,否则 no。1 既非质数也非合数;本题保证 n≥2。
为什么用 break
- 一旦发现某个 i 能整除 n,立刻知道是合数,不必再试后面的数。
- 因子成对出现,试到
i*i<=n即可(不必写到 n−1,也先不用 sqrt)。 - 退出后:若仍满足
i*i<=n,说明是 break 出来的 → 合数;否则 → 质数。 - n=2、3 时循环一开始就不进,自动判为质数。
参考代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int i = 2;
while (i * i <= n) {
if (n % i == 0)
break;
i = i + 1;
}
if (i * i <= n) cout << "no" << endl;
else cout << "yes" << endl;
return 0;
}
- 样例:199 → yes;198 → no。
2 状态变量 flag
用变量取值表示“目前认为是 / 不是”某状态,常见名 flag / f,类型 bool 或 int。
质数版(flag)
bool flag = true; // 先假定是质数
while (i * i <= n) {
if (n % i == 0) {
flag = false;
break;
}
i = i + 1;
}
if (!flag) cout << "no" << endl;
else cout << "yes" << endl;
- 找到因子前把 flag 改成 false,再 break。
- 循环结束后看 flag,不必再靠
i*i<=n猜退出原因。
3 案例2:小杨报数(continue)
从 1 报到 N,跳过 M 的倍数。
参考代码
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
if (i % m == 0) continue;
cout << i << endl;
}
return 0;
}
- 样例:N=5,M=2 → 1 3 5;N=10,M=3 → 1 2 4 5 7 8 10。
- continue 后不必再写 else:能执行到 cout,说明前面 if 没成立。
4 案例3:while(true) + break 求和
读一组正整数,最后一个 −1 表示结束,输出它们的和。个数事先未知。
参考代码
#include <iostream>
using namespace std;
int main() {
int a, s = 0;
while (true) {
cin >> a;
if (a == -1) break;
s = s + a;
}
cout << s << endl;
return 0;
}
- 永真循环先读再说;读到结束标记再 break。
- 也可用
while(1)。
小结
三种典型用法:
试除找到答案 → break
不想处理某些值 → continue
不知道何时结束 → while(true) + break
✓
里程碑达成:
下一节练习:第一个 100 分、最小质因数、偶数和。