c++ - 我正在解决下一个回文的问题,但是当我提交时它给了我 sigsegv 错误
问题描述
我尝试使用所有可能的异常测试用例在我的 IDE 上运行代码并且它工作正常,但我无法弄清楚为什么它显示运行时错误(SIGSEGV)。供您参考,我为您提供问题的链接:- https://www.spoj.com/problems/PALIN/
#include <iostream>
#include <vector>
using namespace std;
bool check_nines(vector<long long> &num, long long size)
{
long long count = 0;
for (long long i = 0; i < size; i++)
{
if (num[i] == 9)
count++;
}
if (count == size)
return true;
else
return false;
}
void copy(vector<long long> &v, long long low, long long high)
{
for (long long i = low; i >= 0; i--)
{
v[high] = v[i];
high++;
}
}
void next_num(vector<long long> &v, long long low, long long high)
{
if (v[low] > v[high])
{
copy(v, low, high);
}
else if (v[low] < v[high])
{
v[low] += 1;
copy(v, low, high);
}
else
{
long long temp_low = low;
long long temp_high = high;
while (temp_low != 0 && temp_high != v.size() - 1)
{
if (v[temp_low] != v[temp_high])
break;
temp_high++;
temp_low--;
}
if (v[temp_low] > v[temp_high])
{
copy(v, low, high);
}
else
{
v[low] += 1;
copy(v, low, high);
}
}
}
void next_num2(vector<long long> &v, long long low, long long high, long long mid)
{
if (v[low] > v[high])
{
copy(v, low, high);
}
else if (v[low] < v[high])
{
if (v[mid] == 9)
{
v[mid] = 0;
v[low] += 1;
copy(v, low, high);
}
else
{
v[mid] += 1;
copy(v, low, high);
}
}
else
{
long long temp_low = low;
long long temp_high = high;
while (temp_low != 0 && temp_high != v.size() - 1)
{
if (v[temp_low] != v[temp_high])
break;
temp_high++;
temp_low--;
}
if (v[temp_low] > v[temp_high])
{
copy(v, low, high);
}
else
{
if (v[mid] == 9)
{
v[mid] = 0;
v[low] += 1;
copy(v, low, high);
}
else
{
v[mid] += 1;
copy(v, low, high);
}
}
}
}
void find_next_palindrome(vector<long long> &v, long long size)
{
if (check_nines(v, size))
{
v[0] = 1;
v.push_back(1);
for (long long i = 1; i < size; i++)
v[i] = 0;
}
else if (size % 2 == 0)
{
long long mid = size / 2;
long long low = mid - 1;
long long high = mid;
next_num(v, low, high);
}
else if (size % 2 != 0)
{
long long mid = size / 2;
long long low = mid - 1;
long long high = mid + 1;
next_num2(v, low, high, mid);
}
cout << "\n";
}
int main()
{
long long t;
cin >> t;
while (t--)
{
long long a, count = 0, temp;
cin >> a;
temp = a;
while (temp)
{
count++;
temp /= 10;
}
vector<long long> v(count);
while (a)
{
v[count - 1] = a % 10;
a /= 10;
count--;
}
long long size = v.size();
if(size==1 && v[0]!=9)
cout<<v[0]+1;
else{
find_next_palindrome(v, size);
for (long long i = 0; i < v.size(); i++)
cout << v[i];
}
cout << "\n";
}
return 0;
}
解决方案
基本情况 Cero 返回 SIGSEGV
而且,我认为您应该首先保存所有输入数字,然后计算并显示结果
例如:
4
123 156 42 99
131 161 44 101
您的代码应如下所示:
int main()
{
std::vector<long long> input;
long long t;
cin >> t;
for (int i = 0; i < t; i++)
{
long long temp;
cin >> temp;
input.push_back(temp);
}
for(t=0; t<input.size();t++)
{
long long a, count = 0, temp;
a = input[t];
temp = a;
if (a < 9)
{
cout << a;
cout << "\n";
continue;
}
while (temp)
{
count++;
temp /= 10;
}
vector<long long> v(count);
while (a)
{
v[count - 1] = a % 10;
a /= 10;
count--;
}
long long size = v.size();
find_next_palindrome(v, size);
for (long long i = 0; i < v.size(); i++)
cout << v[i];
cout << "\n";
}
return 0;
}
推荐阅读
- keras - keras.layers.BatchNormalization() 中的第一个轴是 0 还是 1?
- flutter - Flutter:无法访问音频播放器包的资源
- r - 如何在 R 中抑制 download.file()“正在尝试 URL ...”消息?
- mysql - 如果sql查询中的记录相同,如何分配相同的唯一行号?
- reactjs - 在 Ionic/React 中使用“history.push”并将“IonTabs”作为嵌套路由后,页面未呈现
- java - 使用函数返回的值作为新数组的名称
- vba - 如果满足条件,如何删除书签之前的一串文本?
- c# - EF Core - 多对多与另一个外键
- django - 为什么即使路由器不允许迁移,也会创建 django_migrations 表?
- angular - Rxjs:对Typescript的角度可拖动矩形差异鼠标响应