Я написал код для проблемы «Спой» «Следующий палиндром» и получил неправильное ответное сообщение в своих сообщениях - PullRequest
1 голос
/ 06 мая 2019

Я всегда получаю неправильное ответное сообщение при каждой отправке. Пожалуйста, помогите мне с кодом.

Сообщение при каждой отправке только 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 ]

1 голос
/ 06 мая 2019

Обратите внимание на предупреждения вашего компилятора.

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. Та же ошибка и в другой функции:

bool odd(long long  x){
    int checkv = 0;
    int pal = x;            // compiler warning here
    int con = 0;            // used to take value from pal
0 голосов
/ 06 мая 2019

Ваш метод немного медленный, он может занять слишком много времени для очень больших чисел, до 4 миллиардов итераций ... Вы должны разделить число пополам, отразить верхние цифры числа на младшие цифры. Если полученное число больше, вы нашли следующий палиндром, если нет, увеличьте левую часть и снова отразите. Вот и все. Очень быстро!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...