我是根据素数生成解决这个简单的problem。在Xcode中它成功运行。但是当我向SPOJ提交解决方案时,它会说runtime error SIGSEGV
。我在互联网上搜索了这个运行时错误是什么,当我检查我的解决方案时,我没有看到任何问题。 因此,如果我的代码中存在任何问题,它是什么以及如何解决?
#include <iostream>
#include <list>
using std::cout;
using std::cin;
using std::endl;
int main() {
int tcases = 0;
cin >> tcases;
const int ccase = tcases;
tcases = 0;
while (tcases != ccase) {
int m = 0, n = 0;
cin >> m >> n;
std::list<int> p;
int i = 0;
if (m == 1) i = ++m;
if (m > 1) i = m;
for (; i <= n; p.push_back(i), ++i);
// get all the elements
for (auto first = p.begin(), last = p.end(); first != last; ++first) {
if (*first == 2) continue;
else if (*first == 3) continue;
else if (*first == 5) continue;
else if (*first == 7) continue;
else if (*first % 2 == 0) p.erase(first);
else if (*first % 3 == 0) p.erase(first);
else if (*first % 5 == 0) p.erase(first);
else if (*first % 7 == 0) p.erase(first);
}
for (auto &elem: p)
cout << elem << endl;
cout << endl;
++tcases;
}
return 0;
}
答案 0 :(得分:0)
问题出在你说的时候,
p.erase(first);
Erase删除当前元素并将迭代器返回到列表中的下一个元素,该元素不存储在代码中的任何位置。并且您在for循环中递增first
,因此当下一个循环运行时,first is not pointing to a valid location and hence the runtime error.
将您的for loop
更改为以下
for (auto first = p.begin(), last = p.end(); first != last;) {
if (*first == 2)
{
first++;
continue;
}
else if (*first == 3)
{
first++;
continue;
}
else if (*first == 5)
{
first++;
continue;
}
else if (*first == 7)
{
first++;
continue;
}
else if (*first % 2 == 0)
first = p.erase(first);
else if (*first % 3 == 0)
first = p.erase(first);
else if (*first % 5 == 0)
first = p.erase(first);
else if (*first % 7 == 0)
first = p.erase(first);
else
first++;
}
P.S。 :共享代码只是为了说明如何使用擦除。