我使用eratosthenes筛来解决这个问题,但它给了我SIGABRT错误,虽然我的代码在代码块....上工作得很好请帮我修改这段代码以删除错误....
My code is…
#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;
}
您的j
循环允许i*j
等于n
,但是大小为n
的向量必须从0
索引到n-1
。现有代码允许越界引用元素。
同样的问题也可能出现在最后一个循环中
SIGABRT由库例程发出。
在程序中有两个库例程:std::vector
和sqrt
。
将sqrt(n)
赋值给const变量,或者用:(i * i) < n;
您需要验证:prime[i*j]
是一个有效的位置。换句话说,(i * j) < n
.
关于素数的一些信息(可以帮助你编写程序):
- 素数除2外均为奇数
- 您的测试值可以从3开始,并添加2以获得下一个值。
- 通过在数组中查找值可以节省一些时间已知值。
- 乘法通常比除法快。试着重写你的试着用乘法而不是除法。
- 使用可以包含最大值的数据类型