gpt4 book ai didi

c++ - SPOJ 中的运行时错误

转载 作者:行者123 更新时间:2023-11-28 04:36:13 26 4
gpt4 key购买 nike

我刚开始接触竞争性编程。我有点坚持这个素数。 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;

我已经使用埃拉托色尼筛法解决了这个问题。

最佳答案

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)。

所以你必须重新设计你的算法来存储你的 bool 值,以某种不同的方式指示一个数字是否为质数。

* 注意:我不能完全确定这是否是您的问题,因为您没有说明 up 的输入值是多少|和 low发生此错误。在提问时,您应该提供尽可能多的信息,以便重现您的问题。

关于c++ - SPOJ 中的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51364905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com