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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проверка палиндрома 
:(
    Опции темы
ArniLand
Дата 27.12.2010, 14:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Дано пятизначное число и нужно проверить является данное число палиндромом. Можно использовать только арифметические/логические операции и операторы while/if. Массивы использовать нельзя. Начала с изучения основ программирования на С++, не могу понять какой алгоритм данной задачи. И вопрос немного отходя от темы. Сам придумать алгоритм я не могу и не понять пока что как решить такую задачу, не является это признаком того что программированием я заниматься не смогу?
PM MAIL   Вверх
mes
Дата 27.12.2010, 15:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(ArniLand @  27.12.2010,  13:28 Найти цитируемый пост)
 Можно использовать только арифметические/логические операции и операторы while/if

Пытаясь придумать алгоритм в "компьютерной записи" Вы пропустили важный момент:
для начала сформулируйте понятные для человека признаки по которым можно проверить палиндром ли это.. 
а после уже спокойно и без проблем перевести на ЯП.. 




--------------------
PM MAIL WWW   Вверх
Игорь1024
Дата 27.12.2010, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

#include "iostream.h"
int val=0x12321, res=0;
count()
{
__asm
{
cmp val, val+4
jne exit
cmp val+1, val+3
jne exit
mov res, 1d
exit: ret
}
}

void main()
{
count();
if(res==1)cout<<"It is";
}


Не тестил. Скорее всего есть ошибки. Спать хочу.

Это сообщение отредактировал(а) Игорь1024 - 31.12.2010, 18:35
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
Crafty
Дата 27.12.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Игорь1024, а причем здесь ассемблер?
PM MAIL   Вверх
mes
Дата 27.12.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Игорь1024 @  27.12.2010,  14:24 Найти цитируемый пост)
Не тестил

хм..smile  в разделе "C++ для новичков" предлагать asm код...    smile 
да к тому же неправильный.. палиндром же задан не в 16ричной системе  smile 


--------------------
PM MAIL WWW   Вверх
Игорь1024
Дата 27.12.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile мда, на сях слишком долгие вычисления, а я спать хочу. Мало ли, может подошло бы.
На счёт неправильности.... Система счисления не была указана  smile 

Это сообщение отредактировал(а) Игорь1024 - 27.12.2010, 15:35
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
mes
Дата 27.12.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Игорь1024 @  27.12.2010,  14:35 Найти цитируемый пост)
. Система счисления не была указана   

так у Вас же "12321" есть десятичное число  smile 

к тому же сдвиг идет по байтово, хотя одна шестнадцатиричная цифра занимает ровно половину.. 
smile
 


Это сообщение отредактировал(а) mes - 27.12.2010, 15:58


--------------------
PM MAIL WWW   Вверх
Игорь1024
Дата 27.12.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Баю-баюшки баю...  smile 
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
baldina
Дата 27.12.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Сам придумать алгоритм я не могу и не понять пока что как решить такую задачу, не является это признаком того что программированием я заниматься не смогу? 

нет, не является  smile 
любое боль-менее сложное занятие требует знаний и практики. всё получится
PM MAIL   Вверх
darkart
Дата 27.12.2010, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#include <iostream>

using namespace std;

const int BASE = 10;

int GetDigits( int number )
{
    int digits = 0;
    do
    {
        number = number /= BASE;
        digits++;
    }
    while( number );
    return digits;
}

bool IsPalindrome( int number )
{
    bool result = true;
    int mod, div;
    int digits = GetDigits( number );
    if( digits > 1 )
    {
        mod = BASE;
        div = 1;
        for( int j = 1; j < digits; j++ )
            div *= BASE;    
        int i = 0;
        while( ( i < digits / 2 ) && ( ( ( number % mod ) / ( mod / BASE ) ) ==  ( ( number / div ) % BASE ) ) )
        {
            i++;
            mod *= BASE;
            div /= BASE;
        }
        result = i == digits / 2;
    }
    return result;
}

int main()
{
    int number;
    cout << "Please enter a number:" << endl;
    cin >> number;
    cout << number << " is ";
    if( !IsPalindrome( number ) )
        cout << "not ";
    cout << "palindrome" << endl;
    return 0;
}

PM MAIL WWW ICQ Skype GTalk   Вверх
baldina
Дата 27.12.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



определим палиндром как слово (строка) S длиной N в некотором алфавите,  (т.е. просто последовательность букв алфавита), обладающая свойством
S(i) = S(N-i-1), i изменяется от 0 до N-1
говоря неформально, палиндром - симметричная строка, читающаяся одинаково слева направа и справа налево.
для определенности будем считать пустую строку палиндромом.
для проверки надо последовательно проверить совпадение первого с последним, второго с предпоследним и т.д.

обобщенный алгоритм проверки (в реализации на С++) будет такой:
Код

template <typename Iterator>
bool is_palindrome (Iterator begin, Iterator end)
{
  //  begin - итератор, указывающий на первый элемент
  //  end - итератор, указывающий на последний элемент
  //  операции ++ и -- передвигают итератор на следующий и предыдущий элемент соответственно
  //  *x - значение элемента последовательности, на которое указывает x

  while (begin < end)
  {
     if (*begin != *end)
        return false;

     ++begin;
     --end;
  }

  return true;
}

это не самая общая (и не вполне правильная) реализация на С++, она приводится для простоты введения в тему. вышеприведенный код будет работать для итераторов произвольного доступа, если входная последовательность непуста.
более общий и правильный код будет ниже, а пока поговорим об этом.
ключевое место алгоритма - понятие итератора (у нас это begin и end), который позволяет
1. идентифицировать элемент в последовательности
2. передвигаться вперед и назад
сам алгоритм прост и вытекает из определения палиндрома. замечу, что он использует только цикл, логические и арифметические операции. операции над итераторами в алгоритме похожи на операции с указателями и массивами, однако тут они выражают семантику алгоритма и необязательно работают с массивами и реальными указателями. все зависит от того, чем конкретно является (как реализован) тип Iterator.

В данной задаче алфавитом являются десятичные цифры 0...9, а строкой - запись числа в десятичной системе. т.к. числа в компьютере представлены в двоичном виде, нужно уметь получать первую, вторую...последнюю (десятичную) цифру числа из внутреннего представления. если это решить, останется просто применить вышеприведенный тривиальный алгоритм.

полностью решение приводить не буду, но путь следующий:
операция 
Код

y = x % 10;

помещает в переменную y остаток от деления числа x на 10, т.е. значение последней цифры.

в качестве приложения - менее очевидный, но более общий и правильный код, работающий и для  последовательных итераторов, и пустых строк:
Код

template <typename Iterator>
bool is_palindrome (Iterator begin, Iterator end)
{
  //  begin - указатель на первый элемент
  //  end - указатель на элемент, следующий за последним
  //  если последовательность пуста, то begin == end

  while (begin != end)
  {
     --end;
     if (begin == end)
        return true;
     if (*begin != *end)
        return false;
     ++begin;
  }

  return true;
}

эту функцию можно непосредственно применить к явным последовательностям (контейнерам, имеющим двунаправленные итераторы, в т.ч. к обычным массивам), например
Код

std::string str = "арозаупаланалапуазора";
int arr1[5] = {1,2,3,2,1};
int arr2[5] = {1,2,3,4,5};
std::list<int> l;
l.push_back(2);
l.push_back(1);
l.push_back(2);
std::cout << is_palindrome (str.begin(), str.end()); // вывод: 1
std::cout << is_palindrome (arr1, arr1+5); // вывод: 1
std::cout << is_palindrome (arr2, arr2+5); // вывод: 0
std::cout << is_palindrome (l.begin(), l.end()); // вывод: 1


PM MAIL   Вверх
bsa
Дата 27.12.2010, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PM   Вверх
baldina
Дата 27.12.2010, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bsa, не то. там все про массивы, тут низзя
PM MAIL   Вверх
Skevalt
Дата 27.12.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уже привели правильные решения, напишу и этот вариант на всякий случай
Код

#include <iostream>
#include <cmath>

typedef unsigned int uint;

uint pow10(uint base)
{
    uint res = 1;
    for(int i = base; i > 0; i--)
        res *= 10;
    return res;
}

bool isPalindrome(unsigned int num)
{
    uint quotient  = 0;
    uint remainder = 0;
    uint position  = 0;
    uint reverseNum = 0;
    uint sourceNum = num;

    position = uint(log10(double(num)));
    do{
        quotient  = sourceNum / 10;        
        remainder = sourceNum % 10;
        reverseNum += remainder*pow10(position);
        sourceNum /= 10;
        position--; 
    }while(quotient);

    return (num == reverseNum);
}

int main(int argc, char* argv[])
{
    uint testNum1 = 12321;
    uint testNum2 = 12345;
    uint testNum3 = 1234321;

    if(isPalindrome(testNum1 ))
        std::cout << testNum1 << " is palindrome" << std::endl;
    else
        std::cout << testNum1 << " isn't palindrome" << std::endl;

    if(isPalindrome(testNum2 ))
        std::cout << testNum2 << " is palindrome" << std::endl;
    else
        std::cout << testNum2 << " isn't palindrome" << std::endl;

    if(isPalindrome(testNum3 ))
        std::cout << testNum3 << " is palindrome" << std::endl;
    else
        std::cout << testNum3 << " isn't palindrome" << std::endl;

    return 0;
}


PM MAIL   Вверх
baldina
Дата 27.12.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



продолжим...
надеюсь, ТС подумал самостоятельно прежде чем читать дальше  smile 
требуется построить итератор для целых чисел такой, что бы были корректно реализованы операции сравнения итераторов, разыменования (получения значения, на которое указывает итератор), инкремента и декремента
такой итератор в простейшей реализации мог бы выглядеть так:
Код

/* простейший итератор без контроля выхода за границы */
struct DecDigIter {
  int x;
  int p;
  DecDigIter(int x, bool end=false): x(x),p(0) {
    if (end)
      for (int y=x; y != 0; y /= 10)
         ++p;
  }
  bool operator==(const DecDigIter& other) const { return p==other.p; }
  bool operator!=(const DecDigIter& other) const { return !(*this == other); }
  int operator*() const { return (x/pow10(p)) % 10; }
  DecDigIter& operator++() { ++p; return *this; }
  DecDigIter& operator--() { --p; return *this; }
};

т.е. итератор хранит само число х и текущую позицию p. инкремент/декремент производится тривиальным образом, для разыменования (получение цифры в позиции p) используется выражение
(x/pow10(p)) % 10; Здесь самая трудоемкая операция - возведение в степень.
И хотя реализация нашего алгоритма с этим итератором и "правильной" реализацией возведения в степень чуть быстрее реализации darkart, интуитивно чувствуется, что резерв есть, и можно придумать алгоритм быстрее.

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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