我写的这个问题是在spoj中提交的,它在我的计算机上正常运行,g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1。但是它在spoj上给出了SIGSEGV。 这是我找到下一个回文的代码,有人可以帮忙。 此外,我尝试用信号处理程序捕获它,但它从来没有扔过。请帮助..
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(const vector<int>& v1, const vector<int>& v2)
{
if (v1.size() != v2.size())
return v1.size() < v2.size();
for (int i = 0; i < v1.size(); i++)
if (v1[i] != v2[i])
return v1[i] < v2[i];
return false;
}
void NextPalindrome(vector<int>& num, int pos1, int pos2) {
if (pos1 < 0) {
num[num.size()-1] = 1;
num.insert(num.begin(), 1);
return;
} else if (num[pos1] < 9) {
num[pos1] = num[pos2] = num[pos1] + 1;
return;
} else {
num[pos1] = num[pos2] = 0;
NextPalindrome(num, pos1-1, pos2+1);
return;
}
}
void ConvertToPalindrome(vector<int>& p, int j, int k)
{
while (j >= 0)
{
if (p[j] != p[k])
p[k] = p[j];
j--,k++;
}
}
int main()
{
int t;
cin >> t;
while (t) {
string s;
cin >> s;
vector <int> v;
for (int i = 0;i<s.size(); i++)
v.push_back(s[i]-'0');
int size = v.size();
vector<int> p (v);
if (size %2 == 0)
{
ConvertToPalindrome(p, size/2-1, size/2);
}
else
{
ConvertToPalindrome(p, size/2-1, size/2-1);
}
if (comp(v,p) == 0) {
if (size%2 == 0)
NextPalindrome(p, size/2-1, size/2);
else
NextPalindrome(p, size/2, size/2);
}
for (int i=0;i<p.size();i++)
cout << p[i];
cout << endl;
t--;
}
return 0;
}
答案 0 :(得分:1)
我运行gdb来调试你的程序,段错误发生在函数num[num.size()-1] = 1;
的第void NextPalindrome(vector<int>& num, int pos1, int pos2)
行。当向量num
为空时,索引超出范围。当用户没有输入足够的数字(小于t)时会发生这种情况。您可以检查输入字符串是否为空以避免这种情况:
while (t) {
string s;
cin >> s;
if (s.empty()) {
break;
}
...
}
顺便说一句,Palindrome逻辑似乎错了,你可以自己调试。