Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Операции с очень большими числами

Автор: Gendalf 1.11.2007 4:06

Подскажите пожалуйста каким методом лучше пользоваться при вычислении например 946372635!.
1. Преобразовать число в строку, и со строкой посимвольно работать.
2. Использовать массив из нескольких переменных, типа longint
3. Использовать массив, в каждой ячейке которого будет храниться одна цифра.
Или в Turbo Pascal'е есть возможность создавать переменные, заданным побайтовым размером.
Но не используя встроенный ассемблер.

Это нужно, как вообще возможность, а не для какой-то программы конкретнее.

Автор: volvo 1.11.2007 4:24

Лучше всего не изобретать велосипед, а взять модуль типа того, что лежит у нас в FAQ-е в теме "Длинная арифметика", тем более что и вычисление факториала с его помощью тоже приводилось, и возведение больших чисел в степень... (там подобие твоего третьего варианта используется)

Со строкой, боюсь, много сделать не получится - ограничение в 255 символов очень скоро даст о себе знать...

Автор: daZe1 11.12.2007 22:10

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

Автор: Lapp 12.12.2007 12:59

Цитата(Gendalf @ 1.11.2007 0:06) *
каким методом лучше пользоваться при вычислении например 946372635!.

Боюсь, что разочарую тебя, но методов для вычисления таких чисел не существует.

Сказать, что для одной только записи такого числа не хватит памяти всех существующих на Земле компьютеров - это ничего не сказать. Если изобрести память, которая работает на состояниях отдельных электронов в отдельных атомах, то чтобы набрать нужное количество атомов для нее не хватит атомов всей нашей маленькой Вселенной - я не про Галактику говорю, это вообще капля в море.. И не просто не хватит, а сильно не хватит. Если тебе захотят помочь твои друзья из соседних вселенных (допустим, ты нашел способ с ними связаться) и отдадут их все на производство памяти для твоих нужд - все равно не хватит..

Так что ты уж извини.. Ничем не можем помочь! sad.gif

PS
А вы говорите - глобализм, амбиции, стремление к мировому господству.. Человеку ответ к домашнему заданию записать негде! smile.gif

Автор: Gendalf 24.12.2007 16:47

Цитата(Lapp @ 12.12.2007 8:59) *
Сказать, что для одной только записи такого числа не хватит памяти всех существующих на Земле компьютеров - это ничего не сказать.


А если не записывать, а требуется только вывести его на экран? то в принципе и за буфер видеокарты не выйдем

Автор: Lapp 24.12.2007 17:28

Цитата(Gendalf @ 24.12.2007 12:47) *

А если не записывать, а требуется только вывести его на экран? то в принципе и за буфер видеокарты не выйдем

Я должен признать, что я ошибся. sad.gif Записать, конечно, можно. Не знаю, что на меня наехало тогда, что я спутал само число с его записью - очень извиняюсь.
Да, можно записать. Факториал миллиарда будет иметь грубо говоря где-то сто миллионов (очень грубая оценка) цифр в записи, так что даже если по байту на цифру - то все равно нужна всего сотня мегобайт. Другой вопрос - как обращаться с такими большими числами (в ТР это просто немыслимо) и сколько времени уйдет на расчет (не могу сейчас даже оценить), но факт есть факт: записать такое число можно.

Еще раз извиняюсь..

PS
добавление еще одного восклицательного знака (1000000000!!) делает мои рассуждения верными smile.gif

Автор: Gendalf 24.12.2007 17:49

Цитата(Lapp @ 24.12.2007 13:28) *
Другой вопрос - как обращаться с такими большими числами (в ТР это просто немыслимо) и сколько времени уйдет на расчет (не могу сейчас даже оценить), но факт есть факт: записать такое число можно.


Для этого тема и создана, есть какие-нибудь соображения? Если есть - поделись пожалуйста.

Автор: volvo 24.12.2007 18:01

Цитата
Факториал миллиарда будет иметь грубо говоря где-то сто миллионов (очень грубая оценка) цифр в записи
no1.gif Только нулей в записи числа 1000000000! будет чуть меньше 250 миллионов (249999998 если быть точным)...