在我自己的机器上工作,但在SPOJ上使用SIGABRT

时间:2015-06-16 22:52:54

标签: c++ vector

我正在研究SPOJ http://www.spoj.com/problems/PALIN/上的Next Palindrome问题。我的代码在我自己的机器上工作正常,但是SPOJ给了我SIGABRT。我使用的是C ++ 4.9.2

"当从左到右和从右到左读取十进制系统中的表示时,正整数称为回文。对于给定的正整数K不超过1000000位,写入大于K的最小回文值输出。始终显示数字而不带前导零。

输入

第一行包含整数t,即测试用例的数量。整数K在下一行中给出。

输出

对于每个K,输出大于K的最小回文。"

#include<iostream>
#include<vector>

using namespace std;

// turn 9 to 10
void round(vector<int> &input,int index) {
    int len = input.size();
    input[index] = 0;
    input[len-index-1] = 0;
    // if it is the first digit, add 1 in the front
    if (index == 0) {
        input.insert(input.begin(),1);
    }
    else {
        input[index-1] ++;
        input[len-index] ++;
    }
}

// find the next palindrome
int palin(vector<int> &input) {
    int len = input.size();
    bool large = true;
    bool small = true;
    bool eqal = true;

// if it is a single digit  
    if (len == 1) {
        if (input[0] == 9) {
            input[0] = 11;
        }
        else {
            input[0] ++;
        }
        return 1;
    }

// start from the one before the middle 
    int index = len / 2 - 1;
    while (index >= 0) {
    len = input.size();
    // the number supposed to be the same as input[index]
        int rfl = len-index-1;

        // keep record for if the updated number is smaller/equal to the original
        if (input[index] > input[rfl]) {small = false; eqal = false;}
        else if (input[index] < input[rfl]) {large = false; small = true; eqal = false;}
        else {small = false;}

        if (input[index] == 10) {round(input,index);}
        else {
            input[rfl] = input[index];
        }
        index --;
    };

// restart from the one before the middle
    index = (int)input.size() / 2 - 1;
// unless all digits on the left are larger than right/the more left digits are larger but some closer to the middle are smaller or equal, increase the number
    if (!large || small || eqal) {
        len = input.size();
        if (len % 2 == 1) { // odd
            if (input[index+1] == 9) {
                round(input,index+1);
            }
            else {input[index+1] ++;}   
        }
        else { // even
            if (input[index] == 9) {
                round(input,index);
            }
            else {
                input[index-1] ++; input[index + 1] ++;
            }
    }
        // go over the digits again to make sure it is a palindrome
        while (index >= 0) {
            if (input[index] == 10) {
                round(input,index);
            }
            input[input.size()-index-1] = input[index];
            index --;
        }
    }
    return 0;
}

int main() {
    int count; // how many numbers are there
    cin >> count;
    string buffer; // temporary to store each line of input
    for (int j=0;j<count;++j) {
        vector<int> number;
        cin >> buffer;
        if (cin.fail() || buffer.size() == 0) { // not a number or length==0
            return 1;
        }
        for (int k=0;k<(int)buffer.size();k++) {
            int temp = buffer[k] - '0'; // convert ASCII to int
            number.push_back(temp); // construct vector
        }
        palin(number);
        for (int i=0;i<(int)number.size();i++) {
            cout << number[i];
        }
        cout << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

老实说,蛮力方法效率低下,但代码却很清楚。在这里,我只是继续遍历数字,直到我找到一个回文,为每个数字:

http://coliru.stacked-crooked.com/a/2c7ac595d7c2cfa7

D:\a
c:\a
\my\desk
you\their