Как известно, существует, уже ставшая классической задача сравнения массивов на их сходство. Например, частный случай - является ли палиндромом введённое число. Обычно делают так: вводят число в массив (разделяя цифры пробелами, например), и дальше сравнивают, начиная с крайнего левого и крайнего правого разряда, двигаясь к центру. Однако, мой интерес привлекла задача из учебника Дейтелов, в которой авторы предлагают решить задачу, не прибегая к помощи массивов. Задачу я решал очень долго, но всё-таки решение нашёл и решил его опубликовать - поделиться кодом. Вдруг, кто-то из преподавателей захочет дать эту задачу как задачу для сообразительных на высший балл по предмету "программирование". Язык программирования 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. |