SPOJ中的运行时错误

Runtime error in SPOJ

本文关键字:运行时错误 SPOJ      更新时间:2023-10-16

我刚开始进行竞争性编程。我有点被SPOJ上的素数生成器问题卡住了。代码在GeeksforGeeks IDE上运行良好,但在SPOJ上会出现运行时错误。问题是这样的:

彼得想为他的密码系统生成一些素数。帮帮他!你的任务是生成两个给定数字之间的所有素数!

输入:输入以单行中测试用例的数量t开始(t<=10(。在接下来的t行中的每一个中,存在由空间分隔的两个数字m和n(1<=m<=n<=1000000,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;

}

我用埃拉托斯梯尼筛来解决这个问题。

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的输入值会发生此错误。当你问一个问题时,你应该提供尽可能多的信息,以便重现你的问题。