私はspojで提出するためにこの問題を書いていました。私のコンピュータでg ++(Ubuntu/Linaro 4.6.1-9ubuntu3)4.6.1.But spojにSIGSEGVを与えています。 ここに次の回文を見つけるための私のコードは、誰かが助けてくれることができます。私はあなたのプログラムをデバッグするGDBを実行しプログラムの実行中に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;
}
GDBのようなデバッガで実行すると、少なくとも問題が発生している行番号が表示されます。 –
唯一のことは、vとpの両方がサイズ0の場合、NextPalindromeの2番目の行2がおそらくセグメンテーション違反になることです。また、メインからの2番目のConvertToPalindrome呼び出しは、おそらく "p、size/2-1、size/2 + 1"であるべきです。 123を渡すと、引数がp、0、2ではなくp、0、0であると予想されるはずです – vmpstr
@charles gdbで実行したときにエラーが発生しません。 –