实施埃拉托色尼的筛在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;
}
尝试使用较小的值MAX
。在堆栈上分配如此大的数组会产生(初始)问题。然后替换为动态分配:
bool *prime = new bool[MAX+1];
if (prime==nullptr) // error
...
delete [] prime;
您也可以使用静态分配(将变量定义为全局变量)。
最好是使用一些适当的容器,例如bitset
。
当心那i*i
可能会溢出,因此其他可能出现问题...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句