You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

埃拉托斯特尼筛法输出前n个质数计数器错误问题排查

问题定位
  • 遗漏了第一个质数2:筛法逻辑中arr[2]的值为0(代表质数),但输出循环从i=3开始遍历,直接跳过了最小的质数2。
  • 计数器累加逻辑错误:你把count++写在了for循环的增量位置,意味着每遍历一个数不管是不是质数,计数器都会加1,和你“只有找到质数才累加计数”的设计完全不符。比如遍历到4(合数,不会打印)的时候count也会加,等于提前消耗了计数名额,自然输出的质数数量达不到要求的n。
  • 数组越界风险:你定义的arr数组长度是100,合法索引范围是0~99,但遍历判断写了i <= 100,当i=100时会访问数组越界,属于未定义行为。
修复后的代码
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n;
    cout << "Enter the number of primes you want to print:\n";
    cin >> n;

    int arr[100] {0};
    // 筛法核心逻辑无需修改
    for (int i = 2; i <= sqrt(100); i++)
    {
        if (arr[i] == 0)
        {
            for (int j = 2; i*j < 100; j++)
                arr[j*i] = 1;
        }
    }

    // 修正后的输出循环:从i=2开始遍历,仅命中质数时累加计数器
    for (int i = 2, count = 0; i < 100 && count < n; i++)
    {
        if (arr[i] == 0) {
            cout << i << '\n';
            count++;
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Asta Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 04:57:02