首页 > 解决方案 > 我正在解决下一个回文的问题,但是当我提交时它给了我 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;
}

标签: c++vectorsegmentation-faultpalindrome

解决方案


基本情况 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;
}

推荐阅读