Код рабочий, но нечитабельный. Как его упростить.
#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" );
}
Коли уж число приходит из 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;
}
Немного оптимизированный вариант соседнего ответа (меньше шагов цикла почти в два раза)
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;
}
См. примеры
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Ошибку ловлю на строке 'int *mass1= ArrayGenerate(raz);':
У меня есть класс, но программа вылетает после создания объекта его типа
Как в opengl c++ нарисовать дугу которая начинается с определённой точки и заканчивается определённой точкой Пример - дуги которые между многоугольниками...
Покажите пожалуйста простой пример с variadic templatesХотелось бы следующее