| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Object Pascal: кроссплатформенные технологии > [TP 7.1] Результат операции: 2^n |
| Автор: MuForum 2.2.2008, 16:12 | ||
| Доброе время суток! Сегодня была у меня в городе Олимпиада, а одна из задач была следующиая: # Задача: Вывести на экран значение 2 в n степени. (2^n). - (0<=n<=1000). Я решил эту задачу следующим методом:
- Но если значение больше 17 символов, то на экран далее 17 символа выводиться нули. # Вопрос:: Как РАЦИОНАЛЬНО можно решить данную задачу именно на 'Turbo Pascal 7.1'?! |
| Автор: volvo877 2.2.2008, 16:31 |
| Причем тебе надо не приближенное значение, а точное, до последней цифры, так? Задача явно на длинную арифметику. Ищи на форуме, по-моему уже были реализации. |
| Автор: mmvds 2.2.2008, 16:34 |
Если условие именно такое, как ты написал, то это решение единственное, т.к. не сказано ничего про N, и оно может быть действительным (т.е. как целым, так и дробным). Если же N- натуральное, то метод решением в лоб (т.е. простым перемножением) позволил бы получить значения до 2^30, результат сделав типа longint. Если нужно решить задачу в натуральных числах до N=1000, а это число из 302 цифр, то никакой целочисленный или вещественный тип паскаля не уместит столько. Единственный выход - химичить со строками (string), при этом ограничение в 7.0 на строки не более 256 символов в строке, в 7.1 не в курсе, но скорее всего такое же. Поэтому остается массив из 303 строк по 1 символу (array [1..303] of string[1]) ну а далее пошагово вспомнить как умножается число на другое с переносом разряда. |
| Автор: MuForum 2.2.2008, 16:39 |
| #volvo877, mmvds - Спасибо за консультацию ребята. В принципе я сейчас как раз так и пытаюсь реализовать этот метод, так как другим методом не вижу. P.S. -> По сути стоит создавать одномерный динамический массив, в котором и будут хранить всю информацию. А на экран уже выводить по одном символу. |
| Автор: digitech 2.2.2008, 16:40 | ||
|
| Автор: volvo877 2.2.2008, 16:51 |
| digitech, ты на самом деле думаешь, что число из 300 знаков можно засунуть в LongInt? Я бы не рисковал все-таки |
| Автор: mmvds 2.2.2008, 16:56 |
| digitech, И что, это значения только до 30, как я и писал, а надо до 1000 |
| Автор: digitech 2.2.2008, 17:00 |
| MuForum, если реализуешь свою задачу, покажи код. Интересно. |
| Автор: kuzyara 13.2.2008, 18:04 | ||||
Function ulPower(First, Second :string):string; |
| Автор: volvo877 13.2.2008, 19:55 |
| kuzyara, так, на всякий случай, объясни мне, ты задание читал, или как всегда - Write-Only? Тогда поведай мне, где взять SysUtils и динамические массивы, на которых все построено в приведенном модуле, для Турбо Паскаля? Написать самому? |
| Автор: kuzyara 14.2.2008, 13:40 |
| а я вотЪ что ещё накапал: http://forum.vingrad.ru/forum/topic-58172/unread-1/hl/%25D0%25BA%25D0%25BE%25D0%25BD%25D1%2581%25D1%2582%25D0%25B0%25D0%25BD%25D1%2582%25D0%25B0/index.html |
| Автор: Bug_Hunter 19.2.2008, 14:31 | ||
Во, наваял кой чего:
Хотя, возможно, можно и оптимальнее за счет того, что в отличии от преобразования произвольного двоичного числа к десятичному представлению здесь мы справа вдвигаем только нули и на этом деле возможно можно поймать какую-либо закономерность... |
| Автор: MuForum 3.3.2008, 01:25 | ||||||
Хм, можно будет как-то с тобой связаться, очень хотелось бы данную книгу почитать. # Некоторое время потратив, я сумел выйти на вот такой алгоритм:
P.S. -> Сокращение степени осуществляется, только когда степень чётная(Сдесь можно оптимизировать, хотя из-за этого код возрастёт, поэтому я этого не сделал). - Если кому-то поможет, буду рад. Так же хотелось бы услышать мнения о данном методе. (Можно ещё конечно создавать массив динамически, так как если основание меньше 10, то максимально за один такт массив может разростатся только на одну ячейку). |
| Автор: Bug_Hunter 3.3.2008, 20:32 | ||||||||
Должна быть в библиотеке любого технического вуза. Да вообще, она же под 8-ми разрядные микропроцессоры, там и ассемблер другой, и сами возможности микропроцессоров ограниченные - лучше поискать что-нибуть с похожим названием по каталогу. А ключевой момент в моем примере - двоично-десятичная коррекция - много где описана. Да, я не в Молдове. Ну, если забить на то, что он не работает... Вот тут:
Надо делать так:
Ну и нафик такая оптимизация? Тем более, что ты и тут напортачил, надо так:
|
| Автор: MuForum 3.3.2008, 21:34 | ||
1) Код рабочий, проверял и всё выполнялось корректно... 2) С твоей стороны не красиво упрекать меня, ты лучше бы мне указал на недочёты, а не умничал... p.s. -> В отличие от большинства, я не ждал, пока кто-то опубликует код решения, а сам пытался сделать... - Взял и всё настроение испортил... |
| Автор: Bug_Hunter 4.3.2008, 09:20 | ||||
Значит, так проверял! Вот например, 2^40 = (2^10)^4 = 1024^4 -> 13-тизначное число, а у тебя выводится 15-тизначное. И 3^12 будет 531411, а не 64161 (можно посчитать на калькуляторе). И вообще, при четных степенях двойки твоя прога вылетает в режиме Range Check (должна, конечно, при Overflow Checking, но это известный глюк Борланд Паскаль), хотя никаких фокусов, использующих переход через ноль, в ней нет!
Ну извини - я по серости своей считаю неработоспособнось программы главным недочетом.
Только я опубликовал свое решение, причем работающе, "несколько" раньше, а ты даже не сверил ее результаты со своими. Ты бы из-ви-нил-ся! (Муз. х/ф "Братва и кольцо") |
| Автор: Bug_Hunter 7.3.2008, 16:08 |
| И тишина... MuForum, ты что, выпил йаду с горя? Или все никак не научишся считать до 15-ти? |
| Автор: MuForum 7.3.2008, 16:44 | ||
1) Я не вижу оснований извинятся перед тобой, так как тебя я не оскорблял! 2) А что мне говорить?! - Что может я что-то и не учёл, ну значит я ещё чайник по сравнению с МЕГА программистами... 3) С математикой проблем не возникало... |