使用eratosthenes筛子的变体我在c ++中编写了一段代码,它应该计算素数并将它们存储在矢量中。
在第一部分中,我使用calloc()获取长度为1000的数组ar,这样我就可以将每个数组元素的值初始化为false,并在向量a中计算并存储小于1000的素数。
在第二部分中,我将值设置为开始和结束,以便我在范围[开始,结束]中找到下一个素数。
代码工作正常,可以计算素数(0,10000)但如果查找素数的范围大于该值,则会给出运行时错误。
以下是我的代码。
#include<bits/stdc++.h>
using namespace std;
int main()
{
bool *ar=(bool*)calloc(1000,sizeof(bool));
vector<int> a;
for(int i=2;i<1000;i++)
{
if(!ar[i])
{
a.push_back(i);
for(int j=i*i;j<1000;j+=i)
ar[j]=true;
}
}
int start=1000,end=2000;
while(start<10000)
{
for(int i=0;i<1000;i++)
ar[i]=false;
for(int i=0;i<a.size();i++)
{
int m=start/a[i];
if(start%a[i]>0)
m++;
for(int j=a[i]*m;j<end;j+=a[i])
ar[j-start]=true;
}
for(int i=0;i<1000;i++)
{
if(!ar[i])
{
a.push_back(i+start);
for(int j=(i+start)*(i+start);j<end;j+=i+start)
ar[j-start]=true;
}
}
start+=1000;
end+=1000;
}
for(int i=0;i<a.size();i++)
cout<<a[i]<<' ';
return 0;
}
答案 0 :(得分:0)
我建议静态声明数组ar bool ar[1000];
,然后在访问数组ar
之前放置断言,因为你的计算存在一些问题。运行代码时,IDE将在写入数组边界之外停止
a.push_back(i+start);
for(int j=(i+start)*(i+start);j<end;j+=i+start)
{
assert(j-start >= 0 && j-start < 1000);
ar[j-start]=true;
}