SPOJ中的运行时错误

时间:2018-07-16 15:06:32

标签: c++ runtime-error

我刚开始从事竞争性编程。我有点坚持这个素数。 SPOJ上的发电机问题。代码在GeeksforGeeks IDE上运行良好,但在SPOJ上,它会给出运行时错误。问题是这样的:

Peter想为其密码系统生成一些质数。救救他!您的任务是生成两个给定数字之间的所有素数!

输入: 输入以一行中的测试用例数t开始(t <= 10)。在接下来的t行中的每行中,都有两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000),以空格隔开。

输出: 对于每个测试用例,请打印所有质数p,以使m <= p <= n,每行一个数字,测试用例之间用空行分隔。

示例

Input:
2
1 10
3 5

Output:
2
3
5
7

3
5

我的解决方法是:

# include<iostream>
# include <math.h>

using namespace std;

int main() {

int t;
cin>>t;
while(t--){
    int up,low;
    cin>>low>>up;
    int len = 1000000;
    bool arr[len];
    arr[1]=arr[0]=false;
    for(int i=2;i<=up;i++)
        arr[i]=true;

    for(int i=2;i<sqrt(up);i++) {
        if(arr[i]==true){
            for(int j=(i*i);j<=up;j+=i){
                arr[j]=false;
            }
        }
    }

    for(int i=low;i<=up;i++)
    {
        if(arr[i]==true)
            cout<<i<<endl;
    }
    if(t==1)
        cout<<endl;
}
return 0;

}

我已经用Eratosthenes筛子解决了这个问题。

1 个答案:

答案 0 :(得分:1)

SIGSEGV在C ++中是众所周知的。这意味着您正在尝试访问不允许访问的内存。在您的特定情况下,很有可能*您尝试使用错误的索引访问arr

初始化为bool arr[100000];时,编写arr[i]之类的代码仅对0 <= i <= 99999有效。现在来看一下您的for循环,例如第一个

for(int i=2;i<=up;i++)
    arr[i]=true;

每当您为up输入一个大于99999的数字时,就会在这里引起未定义的行为(很可能是SIGSEGV)。

因此,您必须重新设计算法以存储布尔值,以指示数字是否为质数,以某种方式有所不同。

*注意:我不能完全确定这是否是您的问题,因为您没有说uplow的输入值会发生此错误。提出问题时,您应提供尽可能多的信息,以重现您的问题。