埃拉托斯特尼筛法输出前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
相关产品推荐
相关产品推荐

