Як порахувати факторіал, delphisite

<
The factorial of a positive integer is defined as:
n! = N * (n-1) * (n-2) * (n-3) *. * 2 * 1
1! = 1
0! = 1
Example: 5! = 5 * 4 * 3 * 2 * 1
>
// Iterative Solution:
function FacIterative # 40; n: Word # 41 ;. Longint;
var
f: LongInt;
i: Integer;
begin
f: = 1;
for i: = 2 to n do f: = f * i;
Result: = f;
end;

// Recursive Solution:
function FacRecursive # 40; n: Word # 41 ;. LongInt;
begin
if n> 1 then
Result: = n * FacRecursive # 40; n -1 # 41;
else
Result: = 1;
end;

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

procedure TForm1. bbRunClick # 40; Sender: TObject # 41; ; // обробка події від миші

var // це розділ вказівки змінних

result: string; // змінна result цілого типу

M: array of integer;

// "M" - це матриця, або масив, причому динамічний, тобто його розміри можна

F, i, j, k, n: integer;

// змінювати, це збільшує час виконання програми, але цікаво спробувати

if med. text = '' then

med. text: = '0'; // властивість text компонента med перевіряється на наявність

n: = StrToInt # 40; Trim # 40; MEd. Text # 41; # 41; ;

// введеного числа, StrToInt-перетворення рядка в число

exit; // trim-видалення пробілів з рядка

PB. Max: = # 40; n + sqr # 40; n # 41; # 41; ; // Це визначення розмірів PB

screen. Cursor: = crHourGlass;

// з'являється новий курсор, стандартний "віндовскій"

setLength # 40; M, 2 # 41; ; // визначення меж масиву

M # 91; 0 # 93; : = 1; // привласнення 0-ому елементу масиву М значення 1.

for i: = 1 to n do

PB. StepBy # 40; i * 2 # 41; ; // зміна показань PB

for j: = 0 to k do

SetLength # 40; M, k + 1 # 41; ;

M # 91; j # 93; : = M # 91; j # 93; * I + F; // тут основна ідея програми

if # 40; M # 91; j # 93; div 10 # 41;> 0 then

F: = M # 91; j # 93; div 10;

M # 91; j # 93; : = M # 91; j # 93; mod 10;

for i: = k downto 0 do // перебір цілих значень від k до 0

if M # 91; i # 93;> 0 then

if M # 91; i # 93; = 0 then

SetLength # 40; M, k # 41; ; // зміна розмірів масиву М до кол-ва елементів-k

for j: = k downto 0 do

Result: = Result + IntToStr # 40; M # 91; j # 93; # 41; ;

mmOutput. Lines. Add # 40; IntToStr # 40; n # 41; + '! = '+ Result # 41; ;

if n6. Checked = true then

mmoutput. Lines. Add # 40; 'В цьому числі' + IntToStr # 40; length # 40; result # 41; # 41; + 'Цифр.' # 41; ;

M: = nil; // звільнення пам'яті IntToStr-перетворення числа в рядок

screen. Cursor: = crDefault; // зміна курсору

Med. SetFocus; // передача фокусу вводу компоненту med