N
Negent
Как известно, существует, уже ставшая классической задача сравнения массивов на их сходство. Например, частный случай - является ли палиндромом введённое число. Обычно делают так: вводят число в массив (разделяя цифры пробелами, например), и дальше сравнивают, начиная с крайнего левого и крайнего правого разряда, двигаясь к центру. Однако, мой интерес привлекла задача из учебника Дейтелов, в которой авторы предлагают решить задачу, не прибегая к помощи массивов. Задачу я решал очень долго, но всё-таки решение нашёл (решил!) и решил его опубликовать - поделиться кодом. Вдруг, кто-то из преподавателей захочет дать эту задачу как задачу для сообразительных на высший балл по предмету "программирование". Язык программирования C++.
В общем, решение:
P. S. Использовалась среда программирования MS Visual Studio 2008.
В общем, решение:
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");
}