![]() |
Модераторы: 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, интуитивно чувствуется, что резерв есть, и можно придумать алгоритм быстрее. |
|||
|
||||
mimik |
|
|||
![]() не Rohoss Я ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 1.11.2010 Репутация: нет Всего: 2 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
идея следующая: если удастся простым способом получить "перевернутое" число, его можно просто сравнить с исходным.
такой алгоритм потребует вычисления остатка от деления на 10 для всех цифр исходного числа и формирования из остатков перевернутого числа, умножаемого на 10. т.е. получается довольно простой цикл. пока я это писал Skevalt привел почти тот самый алгоритм. если "отсечь лишнее", получится попроще (и побыстрее).
|
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
может позицию хранить не как индекс, а как степень десяти ? т.е. итерацию проводить не как ++/--, а как *=10 / /=10 Добавлено через 3 минуты и 40 секунд
у этого алгоритма есть недостаток возможно переполнение и как следствие не правильный результат.. Добавлено через 4 минуты и 37 секунд
а чем не устраивает хранение промежуточного числа как строки ? |
||||
|
|||||
mimik |
|
|||
![]() не Rohoss Я ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 1.11.2010 Репутация: нет Всего: 2 |
||||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
не устраивает ТС'а т.к. по условию массивы нельзя использовать. у перевернутого числа действительно возможно переполнение, но вообще он красивый и мне нравится ![]() промышленная реализация, возможно, должна была бы анализировать число и выбирать оптимальный алгоритм.
не вижу смысла. операция должна проводиться не над текущей цифрой, а над предыдущей или следующей. так что можем выиграть лишь одно умножение на 10, стоит ли ради этого жертвовать ясностью? хотя там есть небольшие возможности оптимизации, например можно более оптимально подсчитывать число цифр, вычисляя логарифм эффективным методом. |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну на примере unsigned char : 126 -> [621] -> 109 та же проблема, но на других значениях есть и других целочисленных типов.. ![]() Добавлено через 2 минуты и 52 секунды это смотря как подходить к вопросу.. мне кажется можноэтим подходом как раз повысить ясность..сейчас попробую.. |
|||
|
||||
mimik |
|
|||
![]() не Rohoss Я ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 1.11.2010 Репутация: нет Всего: 2 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
отвлекся.. вот выбрал минутку и сделал набросок :
|
||||
|
|||||
Dov |
|
||||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
Да чего уж там? Запрещать, так запрещать. Тогда уж и без if/while обойдёмся... ![]()
Ты бы, для начала, с полом определил(ась/ся) бы... ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
тогда уж и без рекурсии ![]() а вообще для 5ти-значного числа из задания, все гораздо проще :
Добавлено через 2 минуты и 16 секунд или, как было приведено выше : |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
mes, все верно. вчера спешил и не сразу сообразил)))
точнее, сам себя запутал) Это сообщение отредактировал(а) baldina - 28.12.2010, 10:32 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
чтоб не было переполнения можно ведь переворачивать только половину числа..
Добавлено @ 11:19 вот еще один вариант получения длины числа (32х битного):
этот "switch" можно метагенерить, но мне сейчас лень об этом думать Это сообщение отредактировал(а) mes - 28.12.2010, 11:26 |
||||
|
|||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
![]() переворачивая половину числа можно не вычислять число цифр
|
||||
|
|||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
Чего там? У меня не открывается ссылка. Здесь выложи... -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 13 минут и 41 секунду ![]() |
||||
|
|||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
Не понял тонкого намёка. ![]() Да, алгоритм хороший, но абсолютно не эффективный. Ведь в заданном числе уже первая и последняя цифра могут не совпасть. Зачем же всё это число 'разбирать на запчасти' ? ![]() Но по репе заработал всё-равно... ![]() Я бы изменил как-то так:
Это сообщение отредактировал(а) Dov - 28.12.2010, 20:03 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в числе 10 цифр(если конечно я правильно подсчитал ), а не 9 ![]() Добавлено через 56 секунд другими словами (int)log10 показывает неправильный результат.. |
|||
|
||||
Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
всё правильно показывает, так надо. ![]() -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Ну, положим, из всех вышеприведенных он самый эффективный. Во-вторых, "могут не совпасть" и "не совпадут" вещи неодинаковые. Надо анализировать средний случай. Для этого надо знать, какова вероятность появления палиндрома среди множества проверяемых чисел. А то можно и алгоритм линейного поиска называть самым эффективным, т.к. "может совпасть" при первом же сравнении. Аналитические исследования проводить лениво, а вот стандартный генератор случайных чисел на 200млн значений генерит 2.5млн палиндромов. В этих условиях алгоритм с обработкой половины значительно обгоняет другие. А самые медленные реализации те, что вызывают встроенные pow и log. Кстати, данный результат неформально можно объяснить так - для определения какая цифра первая, а какая последняя, требуется узнать число цифр. Что сразу делает такой алгоритм зависящим от n, где n - число цифр. "Алгоритм половины числа" (назовем его так) в среднем (на произвольном числе) зависит от n/2. зы: за репу спасибо |
|||
|
||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
кому интересно, тут результаты:
http://liveworkspace.org/code/5ad1983fdeb2...2368c01d7f3b717 длину числа пришлось ограничить тремя 000, т.к. на более длинных не проходит тест рекурсивного алгоритма Dov (видимо переполнение, не стал вникать). у себя имею такие результаты (N/A - тест не пройден): для трехзначных чисел
для любых чисел (32bit)
для любых чисел (64bit)
Это сообщение отредактировал(а) baldina - 29.12.2010, 17:53 |
||||||
|
|||||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
Ура! Я античемпион!
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ах да.. сорри.. запутался в трех соснах ![]() но с нулем все равно надо быть осторожным.. Добавлено через 2 минуты и 24 секунды baldina, не думал, что эта тема может сподвигнуть на подобные исследования ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |