【发布时间】:2018-07-28 06:06:10
【问题描述】:
Sieve of eratosthenes 在 C++ 中的实现:
当我运行我的 C++ 程序时,我得到了
“分段错误(核心转储)”
它编译没有任何错误。
在这个程序中,我试图打印两个数字 a 和 b 之间的所有素数。
#include <iostream>
#include <string.h>
#define MAX 1000000
using namespace std;
// Print all primes s.t. a <= prime <= b
int main()
{
int t; // no of test cases
cin>>t;
bool prime[MAX + 1]; // a[i] = true for i = prime
long int count_primes_lte_me[MAX + 1]; // a[i] = Count ( primes ) <= i
long int counter_of_visited_primes;
prime[0] = prime[1] = false;
for(int i = 2 ; i <= MAX ; i++)
{
if(prime[i] == true)
count_primes_lte_me[i] = ++counter_of_visited_primes;
for(int j = i*i ; j <= MAX ; j += i) // sieve of eratosthenes
prime[j] = false;
}
long int a , b;
while(t--)
{
cin>>a>>b;
cout<<count_primes_lte_me[b] - count_primes_lte_me[a - 1]<<endl;
}
return 0;
}
【问题讨论】:
-
只需在调试器中运行程序或在调试器中打开核心文件,您就会看到崩溃的位置和原因
-
for(int i = 2 ; i <= MAX ; i++)这可能是错误的 -
@EdHeal 有什么问题?
-
是的,但这不是问题。个人选择:)
-
@EdHeal:如果您不阅读其余代码,这只是“可能是错误的”。