Prime数字查找器运行时错误

时间:2018-04-21 08:57:50

标签: c++ primes

使用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;
}

1 个答案:

答案 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;
}