Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение палиндрома без массива 
V
    Опции темы
Negent
  Дата 9.12.2011, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.12.2011
Где: Симферополь

Репутация: нет
Всего: нет



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



Negent, молодец что решил. Только программист - он не чукча, он не только писатель, но и должен читать программы других. Например, я эту задачу сделаю так:
Код

#include <iostream>
using namespace std;

int x, y;

int main()
{
    cin >> x;
    int t = x;
    while (t != 0)
    {
        y = y*10 + t%10;
        t /= 10;
    }
    cout << ((x == y) ? "YES" : "NO");
    return 0;
}

P.S. Среда тоже VS2008 ))
PM MAIL   Вверх
bsa
Дата 9.12.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Silent @  9.12.2011,  15:03 Найти цитируемый пост)
Например, я эту задачу сделаю так:

красивое решение. Вот только зачем ты x и y сделал глобальными? Желающим сделать их локальными напоминаю, что локальные переменные по умолчанию не инициализируются нулем, в отличие от глобальных.
PM   Вверх
Silent
Дата 9.12.2011, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 252
Регистрация: 3.10.2006

Репутация: 1
Всего: 9



Цитата(bsa @  9.12.2011,  14:38 Найти цитируемый пост)
красивое решение. Вот только зачем ты x и y сделал глобальными?

а просто так =) задача учебная, требования жестко не зафиксированы. Можно сделать их локальными, можно оформить логику в виде функции bool isPalindrom(int x), можно пойти еще дальше - в ассемблер и sse... и еще стоит заметить, что этот код тоже не работает с отрицательными числами. Все в наших руках )))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.