SIGABRT错误 - https://www.codechef.com/problems/PRIME1

时间:2015-07-24 17:49:30

标签: c++

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

2 个答案:

答案 0 :(得分:1)

您的j循环允许i*j等于n,但尺寸为n的向量必须从0索引到n-1。现有代码允许引用一个超出范围的元素。

在最后一个循环中也会出现同样的问题。

答案 1 :(得分:0)

SIGABRT由库例程发布 您的计划中有两个图书馆例程:std::vectorsqrt

sqrt(n)分配给const变量或将条件替换为:
(i * i) < n;

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

有关素数的一些信息(可以帮助您编写程序代码):

  • 素数为奇数,但值为2。
  • 您的测试值可以从3开始,然后加2以获得下一个值。
  • 您可以通过查看数组中的值来节省一些时间 已知的价值观。
  • 乘法通常比除法快。尝试重写你的 测试使用乘法而不是除法。
  • 使用可包含最大值的数据类型。