测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看
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 分、最小质因数、偶数和。