![]() |
Модераторы: volvo877, Snowy, MetalFan |
![]() ![]() ![]() |
|
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: нет Всего: 4 |
Доброе время суток!
Сегодня была у меня в городе Олимпиада, а одна из задач была следующиая: # Задача: Вывести на экран значение 2 в n степени. (2^n). - (0<=n<=1000). Я решил эту задачу следующим методом:
- Но если значение больше 17 символов, то на экран далее 17 символа выводиться нули. # Вопрос:: Как РАЦИОНАЛЬНО можно решить данную задачу именно на 'Turbo Pascal 7.1'?! -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
Причем тебе надо не приближенное значение, а точное, до последней цифры, так? Задача явно на длинную арифметику. Ищи на форуме, по-моему уже были реализации.
|
|||
|
||||
mmvds |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 22.12.2007 Репутация: нет Всего: 6 |
Если условие именно такое, как ты написал, то это решение единственное, т.к. не сказано ничего про N, и оно может быть действительным (т.е. как целым, так и дробным). Если же N- натуральное, то метод решением в лоб (т.е. простым перемножением) позволил бы получить значения до 2^30, результат сделав типа longint. Если нужно решить задачу в натуральных числах до N=1000, а это число из 302 цифр, то никакой целочисленный или вещественный тип паскаля не уместит столько. Единственный выход - химичить со строками (string), при этом ограничение в 7.0 на строки не более 256 символов в строке, в 7.1 не в курсе, но скорее всего такое же. Поэтому остается массив из 303 строк по 1 символу (array [1..303] of string[1]) ну а далее пошагово вспомнить как умножается число на другое с переносом разряда. |
|||
|
||||
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: нет Всего: 4 |
#volvo877, mmvds - Спасибо за консультацию ребята. В принципе я сейчас как раз так и пытаюсь реализовать этот метод, так как другим методом не вижу.
P.S. -> По сути стоит создавать одномерный динамический массив, в котором и будут хранить всю информацию. А на экран уже выводить по одном символу. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
digitech |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 1.4.2007 Репутация: нет Всего: 1 |
|
|||
|
||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
digitech, ты на самом деле думаешь, что число из 300 знаков можно засунуть в LongInt? Я бы не рисковал все-таки
![]() |
|||
|
||||
mmvds |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 22.12.2007 Репутация: нет Всего: 6 |
digitech, И что, это значения только до 30, как я и писал, а надо до 1000
|
|||
|
||||
digitech |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 271 Регистрация: 1.4.2007 Репутация: нет Всего: 1 |
MuForum, если реализуешь свою задачу, покажи код. Интересно.
|
|||
|
||||
kuzyara |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 13.11.2006 Репутация: нет Всего: 1 |
Function ulPower(First, Second :string):string; Это сообщение отредактировал(а) kuzyara - 13.2.2008, 18:05 --------------------
подпись |
||||
|
|||||
volvo877 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
kuzyara, так, на всякий случай, объясни мне, ты задание читал, или как всегда - Write-Only?
Это сообщение отредактировал(а) volvo877 - 13.2.2008, 19:57 |
|||
|
||||
kuzyara |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 215 Регистрация: 13.11.2006 Репутация: нет Всего: 1 |
![]() а я вотЪ что ещё накапал: http://forum.vingrad.ru/forum/topic-58172/...25B0/index.html Это сообщение отредактировал(а) kuzyara - 14.2.2008, 17:42 --------------------
подпись |
|||
|
||||
Bug_Hunter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 19.2.2008 Где: Бл. Подмосковье Репутация: нет Всего: нет |
Ну, для начала надо вспомнить, что 2^1000 есть единица, сдвинутая на 1000 позиций влево - представить такое число в массиве байт не составит труда. А затем надо преобразовать это число к десятичному представлению методом сдвигов и двоично-десятичной коррекции. Все реализуемо на Турбо-Паскале применением арифметических логических операций и эффективнее, пожалуй, не возможно. Сам алгоритм (с реализацией на Ассемблере) описан, например в книге В.К. Злобин, В.Л. Григорьев "Программирование арифметических операций в микропроцессорах". ЗЫ: Я эту книгу случайно обнаружил в библиотеке санатория и выменял на "Сердца трех" Джека Лондона ![]() ![]() ЗЫ2: По легенде, книга эта была оставлена тому санаторию стоителями в составе документации на автоматизированную котельную ![]() |
|||
|
||||
Bug_Hunter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 19.2.2008 Где: Бл. Подмосковье Репутация: нет Всего: нет |
Во, наваял кой чего:
Хотя, возможно, можно и оптимальнее за счет того, что в отличии от преобразования произвольного двоичного числа к десятичному представлению здесь мы справа вдвигаем только нули и на этом деле возможно можно поймать какую-либо закономерность... |
|||
|
||||
MuForum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 427 Регистрация: 13.6.2007 Где: Молдова, Кишинев Репутация: нет Всего: 4 |
Хм, можно будет как-то с тобой связаться, очень хотелось бы данную книгу почитать. # Некоторое время потратив, я сумел выйти на вот такой алгоритм:
P.S. -> Сокращение степени осуществляется, только когда степень чётная(Сдесь можно оптимизировать, хотя из-за этого код возрастёт, поэтому я этого не сделал). - Если кому-то поможет, буду рад. Так же хотелось бы услышать мнения о данном методе. (Можно ещё конечно создавать массив динамически, так как если основание меньше 10, то максимально за один такт массив может разростатся только на одну ячейку). Это сообщение отредактировал(а) MuForum - 3.3.2008, 02:01 -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли) |
|||
|
||||
Bug_Hunter |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 19.2.2008 Где: Бл. Подмосковье Репутация: нет Всего: нет |
Должна быть в библиотеке любого технического вуза. Да вообще, она же под 8-ми разрядные микропроцессоры, там и ассемблер другой, и сами возможности микропроцессоров ограниченные - лучше поискать что-нибуть с похожим названием по каталогу. А ключевой момент в моем примере - двоично-десятичная коррекция - много где описана. Да, я не в Молдове. Ну, если забить на то, что он не работает... Вот тут:
Надо делать так:
Ну и нафик такая оптимизация? Тем более, что ты и тут напортачил, надо так:
|
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "Delphi" | |
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |