Сейчас на форуме: hgdagon, asfa, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Факториал
Посл.ответ Сообщение


Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 октября 2006 06:07 · Поправил: Hellspawn
· Личное сообщение · #1

извените за столь глупый вопрос, но вот что то всё никак, есть код
[HIGHLIGHT=delphi]
function FactorialX(X: Integer): Int64;
begin
if X = 0 then FactorialX := 1
else FactorialX := FactorialX(X - 1) * X;
end;[/HIGHLIGHT]
но он считает факториал только до 20 дальше похожу переполнение,
я так понимаю челочисленно никак не получится?

1 = 1
2 = 2
3 = 6
4 = 24
5 = 120
6 = 720
7 = 5040
8 = 40320
9 = 362880
10 = 3628800
11 = 39916800
12 = 479001600
13 = 6227020800
14 = 87178291200
15 = 1307674368000
16 = 20922789888000
17 = 355687428096000
18 = 6402373705728000
19 = 121645100408832000
20 = 2432902008176640000
21 = -4249290049419214848 // приехали
22 = -1250660718674968576
23 = 8128291617894825984
24 = -7835185981329244160
25 = 7034535277573963776

а мне нужно хотя бы до 25, как это сделать?

з.ы. что то у меня в опере подсветка кода не встевляется, пришлось руками прописать

-----
[nice coder and reverser]




Ранг: 200.3 (наставник)
Активность: 0.090
Статус: Участник

Создано: 08 октября 2006 06:11
· Личное сообщение · #2

может X: Integer переполняется?

-----
Само плывет в pуки только то, что не тонет.





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 октября 2006 06:14 · Поправил: Hellspawn
· Личное сообщение · #3

DrFits пишет:
может X: Integer переполняется?


нет, это счётчик... млин.. просто потом с этим число ещё арифметичиские действия
надо будет совершать

-----
[nice coder and reverser]





Ранг: 420.3 (мудрец)
Активность: 0.240
Статус: Участник

Создано: 08 октября 2006 06:17
· Личное сообщение · #4

Hellspawn
Из Delphi World:

Процедура для нахождения точного значения факториала числа
---------------------------------------------------------------------- ----------


Процедура для нахождения точного значения факториала числа.

Вы когда-нибудь находили факториал 10? - это легко, а 20?,а 100? Даже с помощью самого продвинутого калькулятора это не получится, (имею в виду точное значение, например в 100!-158 цифр, какой должен быть дисплей калькулятора, чтобы показать такое значение??!)C помощью программы содержащей алгоритм похожий на описанный, это можно сделать. Для такой программы нужна форма(form, содержащая такие компоненты Memo(имя в процедуре mmOutput), Maskedit(med),ProgressBar(PB-это не обязательно, но если считаешь очень большой факториал, то это занимает некоторое время, поэтому визуально следить за временем, оставшимся на вычисление, очень удобно). Идея программы: переменные в Delphi не могут содержать таких длинных чисел, поэтому здесь используется массив целых переменных, обрабатывая который и получаем нужный ответ. В результате можно считать факториалы многотысячных чисел, я считал 5000!,дальше считать долго, но возможно.


[HIGHLIGHT=delphi]
procedure TForm1.bbRunClick(Sender: TObject); //обработка события от мыши
var //это раздел указания переменных
result: string; //переменная result целого типа
M: array of integer;
//"M"- это матрица, или массив, причем динамический, то есть его размеры можно
F, i, j, k, n: integer;
//изменять, это увеличивает время выполнения программы, но интересно попробовать
begin
if med.text = '' then
med.text := '0'; //свойство text компонента med проверяется на наличие
n := StrToInt(Trim(MEd.Text));
//введенного числа, StrToInt-преобразование строки в число
if n < 4 then
exit; //trim-удаление пробелов из строки
PB.Max := (n + sqr(n)); //Это определение размеров PB
PB.Position := 0;
screen.Cursor := crHourGlass;
//появляется новый курсор, стандартный "виндовский"
setLength(M, 2); //определение границ массива
M[0] := 1; //присвоение 0-ому элементу массива М значения 1....
M[1] := 0;
k := 1;
for i := 1 to n do
begin
F := 0;
PB.StepBy(i * 2); //изменение показаний PB
for j := 0 to k do
begin
SetLength(M, k + 1);
M[j] := M[j] * i + F; //здесь основная идея программы
if (M[j] div 10) > 0 then
k := k + 1;
F := M[j] div 10;
M[j] := M[j] mod 10;
end;
end;
for i := k downto 0 do //перебор целых значений от k до 0
begin
if M[i] > 0 then
break;
if M[i] = 0 then
k := k - 1;
end;
SetLength(M, k); //изменение размеров массива М до кол-ва элементов-k
Result := '';
for j := k downto 0 do
Result := Result + IntToStr(M[j]);
mmOutput.Lines.Add(IntToStr(n) + '! = ' + result);
//добавление результата в редактор Memo(mmOutput)
if n6.Checked = true then
mmoutput.Lines.Add('В этом числе ' + IntToStr(length(result)) + ' цифр.');
M := nil; //освобождение памяти IntToStr-преобразование числа в строку
screen.Cursor := crDefault; //смена курсора
Med.Text := '';
Med.SetFocus; //передача фокуса ввода компоненту med
end;
[/HIGHLIGHT]

-----
Сколько ни наталкивали на мысль – все равно сумел увернуться




Ранг: 21.3 (новичок)
Активность: 0.020
Статус: Участник

Создано: 08 октября 2006 06:20
· Личное сообщение · #5

используй real типы, например extended,
но тогда и результат будет в формате floating-point



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 08 октября 2006 06:20
· Личное сообщение · #6

Integer это Word, знаковый => переполнения очевидный... юзай другой тип данных...

-----
Shalom ebanats!





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 08 октября 2006 06:34 · Поправил: Hellspawn
· Личное сообщение · #7

ValdiS спасибо, чуть переписал под свои нужды, работает...
мне нужно целочисленно было, чтобы хоть примерно визуально оценить результат
а работать придётся с extended

-----
[nice coder and reverser]




Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 08 октября 2006 06:36
· Личное сообщение · #8

Hellspawn, юзай Extended.
Только вкллючи {N+}



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 08 октября 2006 10:05
· Личное сообщение · #9

Integer это Word

оригинально



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 08 октября 2006 10:06
· Личное сообщение · #10

> оригинально
хм?

-----
Shalom ebanats!





Ранг: 353.0 (мудрец)
Активность: 0.370
Статус: Участник
resreveR

Создано: 08 октября 2006 11:05
· Личное сообщение · #11

во-первых, СЛВ написал "знаковый word".. в во-вторых, тема исчерпала себя - закрыта

-----
Тут не могла быть ваша реклама



 eXeL@B —› Программирование —› Факториал
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати