SIGABRT error for语言 - https://www.codechef.com/problems/PRIME1



我使用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::vectorsqrt

sqrt(n)赋值给const变量,或者用:
(i * i) < n;

您需要验证:
prime[i*j]
是一个有效的位置。换句话说,(i * j) < n .

关于素数的一些信息(可以帮助你编写程序):

  • 素数除2外均为奇数
  • 您的测试值可以从3开始,并添加2以获得下一个值。
  • 通过在数组中查找值可以节省一些时间已知值。
  • 乘法通常比除法快。试着重写你的试着用乘法而不是除法。
  • 使用可以包含最大值的数据类型

最新更新