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

Тема в разделе "C/C++/C#", создана пользователем Negent, 9 дек 2011.

  1. Negent

    Negent New Member

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А у меня решение чуть-чуть попроще:
    Код (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;
    }
     
  3. Negent

    Negent New Member

    Регистрация:
    9 дек 2011
    Сообщения:
    2
    Симпатии:
    0
    lazybiz, у меня решение по сравнению с твоим просто монстрообразное.
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Negent, я сторонник минимализма.
     
Загрузка...

Поделиться этой страницей