Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2008, 11:08   #1
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
Печаль Определить число Y знаков в факториале от X

Помогите разобраться как решить задачу:
Дано натуральное число X. Определить число Y знаков в факториале от X.

Насколько я понял здесь нужно найти факториал числа, а затем посчитать сколько знаков в факториале от этого числа, т.е. например факториал числа 10=362880, значит количество знаков =6.
Факториал, например, посчитали. А затем как? Число преобразовываем в строку и считаем количество символов в строке? Если да, то каким образом преобразовать число в строку? В книге нашел такую процедуру:
Procedure Str (X [: Width [: Decimals]]; var S: String) - преобразует численное значение Х в его строковое представление S.
Можно ли с помощью этой процедуры преобразовать число в строку? Если да, то что мы пишем в процедуре? str(X,S), где Х-число, а S-перемнная типа Sting? Мне просто непонятна запись [: Width [: Decimals]].

Помогите, кто может разобраться!!!
KnDmPetr вне форума Ответить с цитированием
Старый 23.03.2008, 11:43   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

[: Width [: Decimals]] - это формат преобразования для вещественного числа, количество символов до и после запятой. Для целых чисел он не нужен.
Например, если X=85.1252963, то после str(X:2:3,S); S=85.125.
В вашем случае код следующий:
Код:
str(X,S);
Y:=length(S);
_Dmitry вне форума Ответить с цитированием
Старый 23.03.2008, 14:46   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Собственно нам нужен не факториал числа а только количество знаков в десятичном представлении этого факториала. Т.е. нужно вычислить десятичный логарифм от N!

Можно использовать формулу Стирлинга для приближенного вычисления факториала.

N! := sqrt(2 * PI * n) * (n/e)^n;

Возьмем десятичный логарифм от правой части равенства. После несложных преобразований получаем:

Код:
   var A, B : double;
        Z, n : integer;
   begin
       A := ln( sqrt(2 * PI * n) ) / ln(n) + n - n / ln(n);
       B := (ln(10) / ln(n));
       Z := trunc(A / B)+1;  // количество знаков
   end;
Формулы работают начиная с n=2.

5! - (3)
8! - (5) == 40320
10! - (7) == 3628800
1000! - 2568 знаков
1000000! - 5565709 знаков
alexBlack вне форума Ответить с цитированием
Старый 23.03.2008, 16:04   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Красивое решение. Хорошо, когда кое-какие формулы знаешь.
puporev вне форума Ответить с цитированием
Старый 24.03.2008, 11:06   #5
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию

Решение красивое, только я уже не уверен правильное ли. Просто когда я набрал этот код и проверил, то при N!=1000000 количество знаков программа выдала не 5565709, а 64368. Вот и непонятно, правильно код работает или нет!!! Просьба проверить кто может и поправить что не так. Или автор кода сделал описку когда писал сообщение? .
KnDmPetr вне форума Ответить с цитированием
Старый 24.03.2008, 11:33   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от KnDmPetr Посмотреть сообщение
Просто когда я набрал этот код и проверил, то при N!=1000000 количество знаков программа выдала не 5565709, а 64368. Вот и непонятно, правильно код работает или нет!!! Просьба проверить кто может и поправить что не так. Или автор кода сделал описку когда писал сообщение? .
Я не набивал код в сообщении - это копирование через буфер из рабочей программы. Проверил еще раз и в excel. Все сходится

=LN((2*3,14*1000000)*(2*3,14*100000 0)) / LN(1000000) + 1000000 - 1000000 / LN(1000000) = 927619

=LN(10) = 2,3

=LN(1000000) = 13,82

=2,3/13,82=0,17

=927619/0,17=5 млн с копейками

Проверь еще раз описание типов.
alexBlack вне форума Ответить с цитированием
Старый 24.03.2008, 11:34   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Замени Z, n : integer; на longint;
puporev вне форума Ответить с цитированием
Старый 24.03.2008, 13:40   #8
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Код:
A := ln(sqrt(2 * PI * n) )  + n*ln(n) - n;
Z := trunc(A/ln(10))+1;
Помоему так будет правильней
c точки зрения разьяснений.
Предположим нужно найти количество цифр целого Х
он будет равно trunc(ln(X)/ln(10))+1.
Следовательно мы находим А это ln(n!) где n! по формуле Стирлинга.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 24.03.2008, 17:10   #9
KnDmPetr
Пользователь
 
Регистрация: 02.03.2008
Сообщений: 20
По умолчанию

Цитата:
Замени Z, n : integer; на longint;
Помогло, заработало!!!
KnDmPetr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти и вывести все слова,у котоpых число гласных букв пpевышает число согласных. Briz Помощь студентам 2 11.05.2008 00:56
Ввести число N и определить делится ли оно без остатка на число M (VBA) Ivanich Microsoft Office Excel 7 24.04.2008 19:43
Определить радиус и центр окружности на которой лежит наибольшее число точек. Zoratul Помощь студентам 2 11.01.2008 16:00
Определить n-ое число Фибоначчи - Рекурсия Xeon332 Помощь студентам 3 09.01.2008 19:01
Число N, заменить одну из его цифр, чтобы получилось число, max близкое к некоторой степени двойки urgu_st Помощь студентам 13 23.10.2007 09:14