Як порахувати факторіал, 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