![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
ArniLand |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 17.8.2008 Репутация: нет Всего: нет |
Дано пятизначное число и нужно проверить является данное число палиндромом. Можно использовать только арифметические/логические операции и операторы while/if. Массивы использовать нельзя. Начала с изучения основ программирования на С++, не могу понять какой алгоритм данной задачи. И вопрос немного отходя от темы. Сам придумать алгоритм я не могу и не понять пока что как решить такую задачу, не является это признаком того что программированием я заниматься не смогу?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Пытаясь придумать алгоритм в "компьютерной записи" Вы пропустили важный момент: для начала сформулируйте понятные для человека признаки по которым можно проверить палиндром ли это.. а после уже спокойно и без проблем перевести на ЯП.. |
|||
|
||||
Игорь1024 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 11.5.2009 Где: Дальний Восток Репутация: нет Всего: нет |
Не тестил. Скорее всего есть ошибки. Спать хочу. Это сообщение отредактировал(а) Игорь1024 - 31.12.2010, 18:35 --------------------
The God is real,unless he is declared as integer. |
|||
|
||||
Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
Игорь1024, а причем здесь ассемблер?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
хм.. ![]() ![]() да к тому же неправильный.. палиндром же задан не в 16ричной системе ![]() |
|||
|
||||
Игорь1024 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 11.5.2009 Где: Дальний Восток Репутация: нет Всего: нет |
![]() На счёт неправильности.... Система счисления не была указана ![]() Это сообщение отредактировал(а) Игорь1024 - 27.12.2010, 15:35 --------------------
The God is real,unless he is declared as integer. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так у Вас же "12321" есть десятичное число ![]() к тому же сдвиг идет по байтово, хотя одна шестнадцатиричная цифра занимает ровно половину.. ![]() Это сообщение отредактировал(а) mes - 27.12.2010, 15:58 |
|||
|
||||
Игорь1024 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 11.5.2009 Где: Дальний Восток Репутация: нет Всего: нет |
Баю-баюшки баю...
![]() --------------------
The God is real,unless he is declared as integer. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
нет, не является ![]() любое боль-менее сложное занятие требует знаний и практики. всё получится |
|||
|
||||
darkart |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 379 Регистрация: 9.11.2005 Репутация: нет Всего: 31 |
|
|||
|
||||
baldina |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
определим палиндром как слово (строка) S длиной N в некотором алфавите, (т.е. просто последовательность букв алфавита), обладающая свойством
S(i) = S(N-i-1), i изменяется от 0 до N-1 говоря неформально, палиндром - симметричная строка, читающаяся одинаково слева направа и справа налево. для определенности будем считать пустую строку палиндромом. для проверки надо последовательно проверить совпадение первого с последним, второго с предпоследним и т.д. обобщенный алгоритм проверки (в реализации на С++) будет такой:
это не самая общая (и не вполне правильная) реализация на С++, она приводится для простоты введения в тему. вышеприведенный код будет работать для итераторов произвольного доступа, если входная последовательность непуста. более общий и правильный код будет ниже, а пока поговорим об этом. ключевое место алгоритма - понятие итератора (у нас это begin и end), который позволяет 1. идентифицировать элемент в последовательности 2. передвигаться вперед и назад сам алгоритм прост и вытекает из определения палиндрома. замечу, что он использует только цикл, логические и арифметические операции. операции над итераторами в алгоритме похожи на операции с указателями и массивами, однако тут они выражают семантику алгоритма и необязательно работают с массивами и реальными указателями. все зависит от того, чем конкретно является (как реализован) тип Iterator. В данной задаче алфавитом являются десятичные цифры 0...9, а строкой - запись числа в десятичной системе. т.к. числа в компьютере представлены в двоичном виде, нужно уметь получать первую, вторую...последнюю (десятичную) цифру числа из внутреннего представления. если это решить, останется просто применить вышеприведенный тривиальный алгоритм. полностью решение приводить не буду, но путь следующий: операция
помещает в переменную y остаток от деления числа x на 10, т.е. значение последней цифры. в качестве приложения - менее очевидный, но более общий и правильный код, работающий и для последовательных итераторов, и пустых строк:
эту функцию можно непосредственно применить к явным последовательностям (контейнерам, имеющим двунаправленные итераторы, в т.ч. к обычным массивам), например
|
||||||||
|
|||||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
bsa, не то. там все про массивы, тут низзя
|
|||
|
||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
Уже привели правильные решения, напишу и этот вариант на всякий случай
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
продолжим...
надеюсь, ТС подумал самостоятельно прежде чем читать дальше ![]() требуется построить итератор для целых чисел такой, что бы были корректно реализованы операции сравнения итераторов, разыменования (получения значения, на которое указывает итератор), инкремента и декремента такой итератор в простейшей реализации мог бы выглядеть так:
т.е. итератор хранит само число х и текущую позицию p. инкремент/декремент производится тривиальным образом, для разыменования (получение цифры в позиции p) используется выражение (x/pow10(p)) % 10; Здесь самая трудоемкая операция - возведение в степень. И хотя реализация нашего алгоритма с этим итератором и "правильной" реализацией возведения в степень чуть быстрее реализации darkart, интуитивно чувствуется, что резерв есть, и можно придумать алгоритм быстрее. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |