繁体   English   中英

我正在解决下一个回文的问题,但是当我提交时它给了我 sigsegv 错误

[英]I am solving the problem of next palindrome but when I submit it gives me sigsegv error

我试图在我的 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM