SPOJ中的运行时错误
Runtime error in SPOJ
我刚开始进行竞争性编程。我有点被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(。
所以你必须重新设计你的算法来存储你的布尔值,表明一个数字是否是素数,以某种方式不同。
*注意:我不能完全确定这是否是您的问题,因为您没有说明up
和low
的输入值会发生此错误。当你问一个问题时,你应该提供尽可能多的信息,以便重现你的问题。
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 为什么当 vector 为空时会显示运行时错误?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时错误:矢量下标超出范围:正在检查空集
- 分配给gslice_array会导致运行时错误
- cout 新创建的对象引发运行时错误
- C++在使用std::multimap时出现运行时错误的几率很小
- SPOJ中的运行时错误
- 无法弄清楚为什么我的程序在 spoj 上给出运行时错误而不是在 ideone 上给出运行时错误的原因
- 皮卡迪利广场(SPOJ)的运行时错误犯罪
- 运行时错误 (SIGSEGV) SPOJ 筛子的埃拉托色尼