质数查找器运行时错误

Prime number finder runtime error

本文关键字:运行时错误 查找      更新时间:2023-10-16

使用埃拉托色尼筛子的变体,我用c ++编写了一段代码,它应该计算素数并将它们存储在向量中。
在第一部分中,我使用 calloc(( 获取长度为 1000 的数组 ar,以便我得到每个数组元素初始化为 false 的值,并在向量 a 中计算和存储小于 1000 的素数。
在第二部分中,我取了值的开头和结尾,以便我将在范围 [start,end] 中找到下一个素数。
该代码可以正常工作,无法计算素数 (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;
}

我建议数组 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;
}