我已经为spoj问题“下一个回文”编写了代码,但提交的内容得到错误的答案

时间:2019-05-06 15:22:25

标签: c

每次提交我总是得到错误的答案。请帮我解决代码。

每次提交的邮件只有wrong answer

我尝试了所有极端情况和特殊输入,并且代码似乎可以正常工作,但是提交不被接受。

#include <stdio.h>
#include <stdbool.h>

int getLength(long long x) {
    int length = 0;
    while (x != 0) {
        x = x / 10;
        length++; 
    }
    return length;
}

bool even(long long x) {
    int checkv = 0;
    int pal = x;
    int con = 0;
    int length = getLength(pal);
    length = length / 2;
    while (length--) {
        con = pal % 10;
        checkv = checkv * 10 + con;
        pal = pal / 10;
    }
    if (pal == checkv)
        return true;
    else
        return false;
}

bool odd(long long  x) {
    int checkv = 0;
    int pal = x;
    int con = 0;
    int length = getLength(pal);
    length = length / 2;
    while (length--) {
        con = pal % 10;
        checkv = checkv * 10 + con;
        pal = pal / 10;
    }
    pal = pal / 10;
    if (pal == checkv)
        return true;
    else
        return false;
}

bool checkPal(long long x) {
    int length = getLength(x);
    if (length % 2 == 0)
        return even(x);
    else
        return odd(x);
}

void getPal(long long x) {
    long long pal = x + 1;
    bool again = true;
    while (again) {
        if (checkPal(pal))
            again = false;
        else
            pal++;
    }
    printf("%lli\n", pal);  
}

void main() {
    int n;
    scanf("%d", &n);
    long long a[n];
    int i = 0;
    while (n--) {
        scanf("%lli", &a[i]);
        getPal(a[i]);
        i++;
    }
}

我认为问题出在输入上,即我将输入读为long long,但实际输入可能已超出此限制。

2 个答案:

答案 0 :(得分:1)

注意您的编译器警告。

new_regex = r'\w+\_+\w+\b'

通过将其分配给bool even(long long x){ int checkv = 0; int pal = x; // compiler warning here int con = 0; // used to take value from pal ,您将立即失去long long x中的重要性。同样的错误也存在于另一个函数中:

int pal

答案 1 :(得分:0)

您的方法有点慢,对于非常大的数字可能需要太长时间,最多40亿次迭代...您应该将数字分成两半,将数字的高位数映射为低位数。如果结果数较大,则发现下一个回文,如果没有,则增加左侧部分并再次镜像。而已。很快!