我正在使用eratosthenes的筛来解决这个问题,但是它给了我SIGABRT错误,尽管我的代码在codeblocks上运行良好.... 请帮我修改此代码以删除错误....
我的代码是......
#include<vector>
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
int main()
{
unsigned long int t, n, m,i,j;
vector<int> prime;
cin>>t;
while(t--)
{
cin>>m;
cin>>n;
while(!(1<=m&&m<=n&&n<=1000000000&&n-m<=100000))
cin>>m>>n;
prime.resize(n);
for(i=0;i<n;i++)
prime[i]=1;
prime[0]=0;
prime[1]=0;
for(i=2;i<sqrt(n);i++)
{
if(prime[i]==1)
{
for(j=i;i*j<=n;j++)
prime[i*j]=0;
}
}
for(i=m;i<=n;i++)
{
if(prime[i]==1)
cout<<i<<endl;
}
cout<<endl;
prime.resize(0);
}
return 0;
}
答案 0 :(得分:1)
您的j
循环允许i*j
等于n
,但尺寸为n
的向量必须从0
索引到n-1
。现有代码允许引用一个超出范围的元素。
在最后一个循环中也会出现同样的问题。
答案 1 :(得分:0)
SIGABRT由库例程发布
您的计划中有两个图书馆例程:std::vector
和sqrt
。
将sqrt(n)
分配给const变量或将条件替换为:
(i * i) < n;
您需要验证:
prime[i*j]
是一个有效的位置。换句话说,(i * j) < n
。
有关素数的一些信息(可以帮助您编写程序代码):