Является ли введенное число любой разрядности палиндромом? с использованием цикла

112
22 июня 2019, 07:00

Код рабочий, но нечитабельный. Как его упростить.

#include <iostream>
using namespace std;
void main() {
    int num;
    cin >> num;
    int roz = 1;
    int res = num;
    while( res / 10 ) {
        ++roz;
        res = res / 10;
    }
    int left = 0;
    int right = 0;
    bool answer = false;
    for( int i = roz; i >= 1; i-- ) {
        for( int j = -roz; j < 0; j++ ) {
            left = int( num / pow( 10, i - 1 ) ) % 10;
            right = int( num / pow( 10, roz + j ) ) % 10;
            cout << left << " || " << right << endl;
            if( left == right ) {
                i--;
                answer = true;
                continue;
            }
            else {
                answer = false;
            }
            i = 0;
            break;
        }
    }
    answer ? ( cout << "yes" ) : ( cout << "no\n" );
}
Answer 1

Коли уж число приходит из stdin, то прикинемся ленивыми и обработаем его как строку:

int is_palindrome( const char *s, size_t length )
{
    size_t i = 0, j = length ? length : strlen( s );
    // Требуемый цикл:
    while( i <= j ) {
        if( s[i++] != s[--j] ) {
            return 0;
        }
    }
    return 1;
}
int is_palindrome( const string &s )
{
    return is_palindrome( s.c_str(), s.size() );
}

Но если попался преподаватель без чувства юмора, или число приходит действительно как число... Просто развернём исходное число поразрядно задом наперёд и посмотрим на результат. Получилось то же самое число - ура, палиндром:

int is_palindrome( unsigned long n )
{
    unsigned long m = n;
    unsigned long flip = 0;
    // Требуемый цикл:
    while( m > 0 ) {
        flip *= 10;
        flip += m % 10;
        m /= 10;
    }
    return flip == n;
}
Answer 2

Немного оптимизированный вариант соседнего ответа (меньше шагов цикла почти в два раза)

int is_palindrome(unsigned long n1){
    unsigned long n2 = 0;
    if (!(n1 % 10)) return 0;
    while (n2 < n1) {
        n2 *= 10;
        n2 += n1 % 10;
        n1 /= 10;
    }
    // Идея заключается в том, что для палиндромов с четным количеством 
    // цифр работает условие n2 == n1.
    // При нечетном количестве цифр у числа n2 будет на одну цифру больше
    // (поскольку цикл завершается при n2 >= n1) причем эта 
    // цифра - младший разряд. Поскольку она на результат не влияет, мы 
    // избавляемся от нее путем целочисленного деления на 10
    return n2 == n1 || n2 / 10 == n1;
}

См. примеры

READ ALSO
Ошибка с массивом error: invalid conversion from &#39;int&#39; to &#39;int*&#39;

Ошибка с массивом error: invalid conversion from 'int' to 'int*'

Ошибку ловлю на строке 'int *mass1= ArrayGenerate(raz);':

125
Не правильно работает структура

Не правильно работает структура

У меня есть класс, но программа вылетает после создания объекта его типа

119
Как в OpenGL нарисовать дугу?

Как в OpenGL нарисовать дугу?

Как в opengl c++ нарисовать дугу которая начинается с определённой точки и заканчивается определённой точкой Пример - дуги которые между многоугольниками...

102
Помогите разобраться variadic templates

Помогите разобраться variadic templates

Покажите пожалуйста простой пример с variadic templatesХотелось бы следующее

135