Интернет-судья отклоняет мой ответ

Следующий палиндром

Приведенный ниже код является решением этой проблемы

Целое положительное число называется палиндромом, если его представление в десятичной системе одинаково при чтении слева направо и справа налево. Для заданного положительного целого числа K, не превышающего 1000000 цифр, запишите значение наименьшего палиндрома, большего K, для вывода. Числа всегда отображаются без начальных нулей.

вход

Первая строка содержит целое число t - количество тестов. Целые числа K приведены в следующих t строках.

Выход

Для каждого K выведите наименьший палиндром больше, чем K.

пример

Вход:2 808 2133

Выход:818 2222

#include <iostream>

using namespace std;

int main()
{
 long t;
 cin>>t;
 long a[t],k;
 for(long i=0;i<t;++i)
{

    cin>>k;
    a[i]=k;

}

 for(long i=0;i<t;++i)
 {
    long palin=0,num;
    palin=a[i];
    num=palin+1;

    while(1)
    {
        long x=0,rev=0,ans=num;
        do
        {
            x=ans%10;
            rev=rev*10+x;
            ans=ans/10;
        }while(ans);  
        if(rev==num)
        {
            cout<<"\n"<<rev<<"\n";
            break;
        }    
        else
            ++num;
    }     
 }      
return 0;
}

Код дает мне ожидаемый результат, я даже внес изменения в код, сделав переменные K и t равными LONG, если я сделаю их длинными, а не длинными, или есть какие-то проблемы с моей логикой...?

2 ответа

Решение

Вы можете написать эффективную программу, используя строку вместо long. Я использовал это. Здесь я даю код:

#include<iostream>

using namespace std;

#include<string.h>

int main()
{
    char s[80];   //you can take any big index instead 80
    gets(s);
    int a=0,l=strlen(s);

    for(int i=0;i<l;i++) {
        if(s[i]==s[l-i]) {
            a++;
        }
    }

    if(a==l) {
        cout<<"Number is palindrome";
    }
    else {
        cout<<"Number is not palindrome";
    }

    return(0);
}

Действительно ли задача обрабатывать целые числа до 1 000 000 цифр? Или вход меньше 1М?
"long" гарантированно будет иметь длину не менее 32 бит (поэтому беззнаковый long может содержать целые числа [0, 4 294 967 295]. Поэтому, если ваш ввод < 1M, вы можете использовать только обычную long.
"long long" гарантированно имеет длину не менее 64 бит, поэтому диапазон для длинного long без знака равен [0, 18x10^18]. Больше 4М, но все еще намного меньше десятичных цифр 1М.

Другая проблема с вашим кодом заключается в том, что он выглядит так, как будто вы пытаетесь динамически выделить массив стека.

cin>>t;
long a[t],k;

Вы не можете предоставить переменную в качестве размера массива. Это очень базовый момент в C++, и вы должны выполнить одно из следующих действий:

  1. Используйте постоянный максимальный размер во время компиляции для массива (простейшее решение).

    #define A_MAX_SIZE 100
    long a[A_MAX_SIZE];
    
  2. Используйте динамический массив (но тогда вы должны выделить и удалить его позже).
    Смотрите ссылку: http://www.cplusplus.com/doc/tutorial/dynamic/

  3. Используйте контейнер STL, который позаботится о памяти для вас.
    Например: http://www.cplusplus.com/reference/stl/vector/vector/

Другие вопросы по тегам