我刚开始从事竞争性编程。我有点坚持这个素数。 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筛子解决了这个问题。
答案 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)。
因此,您必须重新设计算法以存储布尔值,以指示数字是否为质数,以某种方式有所不同。
*注意:我不能完全确定这是否是您的问题,因为您没有说up
和low
的输入值会发生此错误。提出问题时,您应提供尽可能多的信息,以重现您的问题。