![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Пользователь
Регистрация: 19.10.2010
Сообщений: 17
|
![]()
Компиллятор Visual Studio 2008, но это вроде роли не играет..
Мне вообще требуются такие большие числа для испытания скорости работы алгоритма, причем чтобы не нужно было вводить с клавиатуры. И еще вопрос: посмотрите, кто разбирается, правильно ли у меня функция вычисляет чило знаков в десятичной записи числа Эн факториал: Код:
|
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 12.06.2008
Сообщений: 76
|
![]()
Число знаков - всмысле сколько цифр? Я правильно понимаю?
Ну, вот: Код:
Последний раз редактировалось Dogmat; 28.06.2011 в 23:35. |
![]() |
![]() |
![]() |
#13 | |
Пользователь
Регистрация: 19.10.2010
Сообщений: 17
|
![]()
Да, нужно посчитать количество цифр. Формулу я взяла по аналогии с вычислением для двоичной сислемы, но не знаю, верна ли аналогия. Для 1000000! дает результат больше 2000000, который слишком-уж большой.
Цитата:
|
|
![]() |
![]() |
![]() |
#14 |
Пользователь
Регистрация: 12.06.2008
Сообщений: 76
|
![]()
блин ) назвал неправильно ) Факториал она считает, а назвал НОД, прошу прощения. Да - рекурсивная, для проверки сгодится и рекурсия. При больших n, конечно выскочит stackoverflow, но я лично не видел, чтобы брали большие факториалы. Можно и цикл.
Использовал просто для проверки, считал факториал, выводил на консоль. Потом считал по вашей формуле количество знаков, округлял до большего, до меньшего и до ближайшего. Сравнивал. Ну и похоже чего-то не хватает в формуле. Проверял на факториалах до 20!. Для __int64 дальше будет переполнение, но уже на 20 значениях видно расхождение. Что касается 1000000! (ого), а как вы его считали? Сдается мне. что даже при использовании long double произойдет переполнение. А calc у меня при вычислении 1000000! выдал freezy. Так что, если вам удастся посчитать факториал 1000000! там наверняка больше 2 млн. знаков и будет, потому что при использовании long double для 1000! знаков у меня было больше 2500. Почему-то молчат математики... Последний раз редактировалось Dogmat; 29.06.2011 в 23:26. |
![]() |
![]() |
![]() |
#15 |
Пользователь
Регистрация: 12.06.2008
Сообщений: 76
|
![]()
А можно узнать откуда формула взята? Или на основании чего получена...
|
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 19.10.2010
Сообщений: 17
|
![]()
формула взята из довольно авторитетного источника: Р. Седжвик. Фундаментальные алгоритмы на С++/*Есть такие же на С и Java, но я Java не знаю, а на С не интересно*/. Часть 1-4. Там также есть и доказательство, но оно смутное и я не поняла, для двоичной системы
В том-то и дело, ято явное вычисление факториала не получится, нужно косвенно. И если функция неправильно считает, тогда где ошибка? |
![]() |
![]() |
![]() |
#17 |
Пользователь
Регистрация: 12.06.2008
Сообщений: 76
|
![]()
Ну, общем, достала эта формула уже ) Я пришел к выводу, что все верно, не понял только, как появилась единица. Корнень за единицу приняли? Я так полагаю, что ответ и должен быть приблизительным, поскольку вычисления с логарифмами приблизительны. А так, опираясь на:
1) lg(n) приблизительно равно количеству цифр требуемых для представления числа; 2) Формула Стирлинга. Ну и получаем lg(n!) приблизительно равно количеству разрядов, необходимых для представления числа n! в системе счисления в основании логарифма (у нас 10). А по Стирлингу n! = ((n/e)^n) * sqrt(2 * pi * n) * (1 + O); Все как у вас, если вы корень за 1 приняли. Я корень оставил и получил близкие результаты. Код:
Код:
Затем решил проверить уж совсем наверняка простую формулу, lg(n) (по основанию 2). Код:
Для bin-системы неверное считает для 1! и 2!. А дальше все стабильно, при условии, что результат округляем в сторону большего в любом случае (как и пишет Седжвик - наименьшее целое, больше lg(n!)). Вот переправленный пример для dec (base == 10), с использованиеим long double, для первых 1000!. Код:
Последний раз редактировалось Dogmat; 05.07.2011 в 20:26. |
![]() |
![]() |
![]() |
#19 |
Форумчанин
Регистрация: 11.02.2011
Сообщений: 131
|
![]()
До 1 млн.:
Код:
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Случайное число | mactepmac | Общие вопросы Delphi | 5 | 22.06.2011 09:58 |
Случайное число | rommster | Общие вопросы C/C++ | 13 | 09.10.2010 15:11 |
Как генирируеться случайное число? | Altera | Общие вопросы Delphi | 8 | 20.04.2008 18:20 |
Случайное число | Altera | Общие вопросы Delphi | 4 | 05.02.2008 22:22 |
Как згенерировать случайное число | SeRhy | Помощь студентам | 2 | 25.11.2007 20:27 |