Определение Палиндрома Без Массива

Negent

New member
09.12.2011
2
0
#1
Как известно, существует, уже ставшая классической задача сравнения массивов на их сходство. Например, частный случай - является ли палиндромом введённое число. Обычно делают так: вводят число в массив (разделяя цифры пробелами, например), и дальше сравнивают, начиная с крайнего левого и крайнего правого разряда, двигаясь к центру. Однако, мой интерес привлекла задача из учебника Дейтелов, в которой авторы предлагают решить задачу, не прибегая к помощи массивов. Задачу я решал очень долго, но всё-таки решение нашёл (решил!) и решил его опубликовать - поделиться кодом. Вдруг, кто-то из преподавателей захочет дать эту задачу как задачу для сообразительных на высший балл по предмету "программирование". Язык программирования C++.
В общем, решение:
C++:
#include "stdafx.h"

#include <iostream>
#include <string>

using namespace std;

void main ()
{
string nameT;
int palindrome, palindromeT, palindromeR, discharges;
int i=1;
cout<<"Please enter your name: ";
cin>>nameT;
cout<<"Hello, "<<nameT<<"! It's palindrome program.\n"<<"If the entered positive digit is palindrome, program says to you...\n";
cout<<"Enter the possible palindrome: ";
//Программа не определяет симметрию отрицательных чисел. Число, предполагаемый кандидат в палиндромы, вводится без знака
cin>>palindrome;
palindromeR = palindrome;
//Определяем размер числа (количество разрядов)
while (palindromeR > 10)
{
palindromeT = palindromeR % 10;
palindromeR = palindromeR / 10;
i=i+1;
}
int a = i;
int c = i;
int k;
i = 0;
palindromeR = palindrome;
palindromeT = palindrome;
cout<<"Discharges: "<<a<<endl;
if (a >= 2) //Если число, предлагаемое к тестированию на свойство палиндрома, имеет один знак - тестирование не производится
{
int tenMax, palindromeS, palindromeM;
cout<<"If you see words 'Digit missed' - it's not palindrome!\n";
while (i < a)
{
//Считывание значений разрядов снизу вверх, начиная с младшего. 
//Выполняется операция деления на 10, узнаём остаток от числа (это крайний правый разряд)
//Потом сокращаем наше тестируемое число-образец на один разряд (целочисленным делением на 10).
palindromeS = palindromeR % 10;
palindromeR = palindromeR / 10;
tenMax = 1;
k = c;
palindromeT = palindrome;
while (k > 1)
{
//Считывание значений разрядов сверху вниз, начиная со старшего.
//Выполняется операция деления на 10 в степени, ( 10 в такой степени, что на один разряд меньше разрядной величины числа).
//Далее, вычисляется остаток от деления на 10. Узнаём величину старшего разряда.
k = k - 1;
tenMax = tenMax * 10;
};
c = c - 1;
i = i + 1;
palindromeM = palindromeT / tenMax;
palindromeM = palindromeM % 10;
cout<<palindromeS<<endl<<palindromeM<<endl;
//Полученные значения разрядов используются для сравнения. Если цифры не соответствуют, выдаётся сообщение "Цифра пропущена"
if (palindromeS != palindromeM) cout<<"Digit missed!\n";
else cout<<"Okay!\n";
};
}
//Если ввести число из одного разряда (частный случай палиндрома), то будет выведено соответствующее значение
else cout<<"You have very small digit. It's not the palindrome!\n";
system ("pause");
}
P. S. Использовалась среда программирования MS Visual Studio 2008.
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
А у меня решение чуть-чуть попроще:
C++:
#include <iostream>

using namespace std;

int main()
{
int		a, d, m, n, f = 0;

cin >> d;

for ( a = d, m = n = 1; a /= 10; m *= 10, n++ );

a = d;
n /= 2;
while ( n-- ) {
f |= ((d / m) % 10) ^ (a % 10);
m /= 10;
a /= 10;
}

cout << (!f ? "Палиндром" : "Не палиндром") << endl;

return 0;
}
 

Negent

New member
09.12.2011
2
0
#3
lazybiz, у меня решение по сравнению с твоим просто монстрообразное.