Факториал числа n — это функция, которая возвращает произведение всех натуральных чисел от 1 до n включительно.
Для обозначения факториала используется восклицательный знак — “!”.
n! = 1 ⋅ 2 ⋅ 3 ⋅ 4 ⋅ … ⋅ n
Факториал нуля 0! = 1
Программа для рекурсивного вычисления факториала
Если посмотреть на формулу n! = 1 ⋅ 2 ⋅ 3 ⋅ 4 ⋅ … ⋅ n с обратной стороны, то можно заметить, что факториал числа n равен n! = (n — 1)! ⋅ n.
Записав это выражение в виде функции получим — f(n) = f(n-1) ⋅ n.
Код программы:
{$CODEPAGE UTF8}
program FactorialCalc;
var
result : QWord;
x : integer;
function Factorial(n : integer) : QWord;
begin
if (n = 0) or (n = 1) then
Factorial := 1
else
Factorial := Factorial(n - 1) * n;
end;
begin
writeln('Рекурсивное вычисление факториала');
write('x = ');
readln(x);
result := Factorial(x);
writeln(x, '!', ' = ', result);
readln;
end.
В программе использован тип QWord (без знаковое 64-битное число) для получения наибольшего результата. Используя этот тип, можно найти факториал числа до 20, если число больше двадцати, то результат будет с ошибкой.
Если этот тип данных не поддерживается вашим компилятором, вы можете заменить QWord на любой другой целочисельный тип(к примеру integer).
Программа для вычисления факториала в цикле
{$CODEPAGE UTF8}
program Factorial;
var
k, res : QWord;
function Fact(n : integer) : QWord;
var
i : integer;
begin
Fact := 1;
if n > 0 then
for i := 1 to n do
Fact := Fact * i;
end;
begin
writeln('Вычисление факториала');
write('Введите целое число от 0 до 20 ');
readln(k);
res := Fact(k);
writeln(k, '!', ' = ', res);
readln;
end.
Смотрите также:
The factorial program in C of a non-negative integer is the multiplication of all integers smaller than or equal to n. In this article, we will learn how to find the factorial of a number using the C program.
Example:
Factorial of 6 is 6*5*4*3*2*1 which is 720.
Method to Find Factorial of a Number
There are multiple methods to find the factorial of a Number as mentioned below:
- Iterative Solution
- Recursive Method
- Tgamma() Method
- Using Pointers
1. Iterative Solution
Factorial can also be calculated iteratively as recursion can be costly for large numbers. Here we have shown the iterative approach using both for and while loops.
i). Factorial Program Using For Loop in C
C
#include <stdio.h>
unsigned
int
factorial(unsigned
int
n)
{
int
res = 1, i;
for
(i = 2; i <= n; i++)
res *= i;
return
res;
}
int
main()
{
int
num = 5;
printf
(
"Factorial of %d is %d"
,
num, factorial(num));
return
0;
}
Output
Factorial of 5 is 120
The Complexity of the Method
Time Complexity: O(n)
Auxiliary Space: O(1)
ii). Factorial Program Using While loop in C
C
#include <stdio.h>
unsigned
int
factorial(unsigned
int
n)
{
if
(n == 0)
return
1;
int
i = n, fact = 1;
while
(n / i != n) {
fact = fact * i;
i--;
}
return
fact;
}
int
main()
{
int
num = 5;
printf
(
"Factorial of %d is %d"
,
num, factorial(num));
return
0;
}
Output
Factorial of 5 is 120
The Complexity of the Method
Time Complexity: O(n)
Auxiliary Space: O(1)
2. Using Recursive Solution
Factorial can be calculated using the following recursive formula.
n! = n * (n-1)! n! = 1 if n = 0 or n = 1
i). Factorial Program Using Recursion in C
C
#include <stdio.h>
unsigned
int
factorial(unsigned
int
n)
{
if
(n == 0)
return
1;
return
n * factorial(n - 1);
}
int
main()
{
int
num = 5;
printf
(
"Factorial of %d is %d"
,
num, factorial(num));
return
0;
}
Output
Factorial of 5 is 120
The Complexity of the Method
Time Complexity: O(n)
Auxiliary Space: O(n)
ii). Factorial Program Using Ternary Operator in C
C
#include <stdio.h>
int
factorial(
int
n)
{
return
((n == 1 || n == 0) ? 1 : n * factorial(n - 1));
}
int
main()
{
int
num = 5;
printf
(
"Factorial of %d is %d"
,
num, factorial(num));
return
0;
}
Output
Factorial of 5 is 120
The Complexity of the Method
Time Complexity: O(n)
Auxiliary Space: O(n)
3. Using tgamma() Method
The tgamma() method is a library function in math.h library in C programming language that computes the gamma function of the passed argument. Below is the C program to implement the approach:
C
#include <math.h>
#include <stdio.h>
int
main()
{
int
num = 5;
num = tgamma(num + 1);
printf
(
"Factorial is %d"
, num);
return
0;
}
4. Using Pointers
Below is the C program to find the factorial of a number using Pointers:
C
#include <math.h>
#include <stdio.h>
int
factorial(
int
n,
int
*fact)
{
int
x;
*fact = 1;
for
(x = 1; x <= n; x++)
*fact = *fact * x;
}
int
main()
{
int
fact;
int
num = 5;
factorial(num, &fact);
printf
(
"Factorial of %d is %d"
,
num, fact);
return
0;
}
Output
Factorial of 5 is 120
The Complexity of the Method
Time Complexity: O(n)
Auxiliary Space: O(1)
Last Updated :
22 May, 2023
Like Article
Save Article
Вычислить факториал числа
Просмотров 4.5к. Обновлено 8 сентября 2021
Вычислить факториал введенного числа.
Факториалом числа называют произведение всех натуральных чисел до этого числа включительно. Например, факториал числа 4 равен 1*2*3*4 = 24. Записывается факториал так: 4! = 24.
Поскольку факториал резко увеличивается с каждым следующим числом не следует вводить больших чисел.
- Присвоим переменной, накапливающей произведение натуральных чисел, начальное значение 1.
- Присвоим переменной-счетчику значение 2.
- Пока переменная счетчик не достигнет числа, введенного пользователем,
- умножать значение переменной, в которой накапливается произведение, на значение переменной счетчика,
- увеличивать счетчик на 1.
Pascal
Язык Си
Python
КуМир
Basic-256
Программа вычисляет факториал положительного числа N:
fact(0) = 1;
fact(n) = fact(n-1)*n;
Решение:
факториал можно вычислять рекурсивно (по формуле, приведенной выше).
program functions_4; uses crt; var n: integer; function factorial(m: integer): integer; var i, f: integer; begin f:=1; for i:=1 to m do f:=f*i; factorial:=f; end; begin clrscr; write('N > '); read(n); write(n, '! = ', factorial(n)); readkey; end.
Чтобы понять это решение вам пригодится материал по теме «Функции и процедуры в Pascal«.
Другое решение — вычисление факториала в цикле:
Program factorial; Uses Crt; Var f,n,i : LongInt; Begin ClrScr; Write('Введите n=');readln(n); f:=1; For i:=1 To n Do f:=f*i; Write('Факториал от числа ',n,'! = ',f); Readln End.
Чтобы понять это решение достаточно материала лекции «Циклы в Pascal«.
В данной задаче нам понадобятся 3 переменные. Переменная n будет хранить в себе число вводимое с клавиатуры. Переменная i будет играть роль счетчика для цикла. Переменная f хранит в себе окончательный результат.
Задачу по поиску факториала проще всего решить с помощью цикла for. В начале программы мы вводим число n. После этого присваиваем переменной f значение 1 (для того, чтобы правильно считать произведение). В цикле for считаем значение факториала и заносим его в переменную f.
Допустим, мы ввели число 3 ( n ) , тогда цикл работает так :
1 шаг : 1(f) * 1(i) = 1 ( f )
2 шаг : 1(f) * 2(i) = 2 ( f )
3 шаг : 2(f) * 3(i) = 6 ( f )
Стоит учитывать тот факт, что факториал 9 (девяти) равен 362880
, что больше чем в 10 раз превышает максимальное значение для типа Integer
(диапазон от -32 768
до +32 767
), поэтому в данном примере лучше использовать тип LongInt, диапазон которого от -2147483648
до +2147483647
. Если же и этого будет недостаточно, то можно воспользоваться вещественными типами, количество значащих цифр в которых достигает 20.
Рекурсивные методы[править]
Примеры реализаций рекурсивных функций для вычисления факториала.
Pascal[править]
function fact(n : integer) : longint; begin if n <= 1 then fact := 1 else fact := n * fact(n - 1); end;
Delphi[править]
С подключённым модулем System.Math
function fact(n : integer) : int64; begin Result:=IfThen(n <= 1, 1, n * fact(n - 1)); end;
C/C++[править]
int factorial(int n) { return n<=1 ? 1 : n * factorial(n-1); }
int factorial(int n) { if(n<=1) return 1; return n*factorial(n-1); }
Common Lisp[править]
(defun factorial (n) (if (= n 0) 1 (* (factorial (- n 1)) n)))
Clojure[править]
(defn fact[x] (if (<= x 1) 1 (* x (fact (- x 1)) )))
Forth[править]
: factorial ( n -- n! ) dup 0= if drop 1 else dup 1- recurse * endif ;
Go[править]
func Factorial(n uint) uint { if n == 0 { return 1 } return n * Factorial(n - 1) }
Scheme[править]
(define (factorial n) (if (= n 0) 1 (* (factorial (- n 1)) n)))
Ruby[править]
def factorial n n > 1 ? n * factorial(n - 1) : 1 end
Rust[править]
fn factorial_recursive (n: u64) -> u64 { match n { 0 => 1, _ => n * factorial_recursive(n-1) } } fn main () { println!("{}", factorial_recursive(5)) }
PHP[править]
function factorial($n) { return $n ? $n * factorial($n-1) : 1; }
Perl[править]
#!/usr/bin/perl sub factorial { my $n = shift; if ($n==0) { return 1; } else { return $n*factorial($n-1); } } print factorial(shift);
или однострочник
perl -e 'sub f{ $_[0] <= 1 ? 1 : $_[0] * f($_[0] - 1)}; print f(shift)' number
Simula[править]
integer procedure factorial (n); integer n; factorial := if n=0 then 1 else n*factorial(n-1); begin integer n; n:=10 outint(n,5); outtext("! = "); outint(factorial(n),10); outimage; end
Smalltalk[править]
factorial "Answer the factorial of the receiver." self = 0 ifTrue: [^ 1]. self > 0 ifTrue: [^ self * (self - 1) factorial]. self error: ’Not valid for negative integers’
Swift[править]
func factorial(_ n: Int) -> Int { return n == 0 ? 1 : n * factorial(n - 1) }
Algol 68[править]
PROC factorial = (INT n) INT: BEGIN IF n=0 THEN 1 ELSE n*factorial(n-1) FI END; print (factorial(10))
Ada[править]
function Factorial (N: Natural) return Natural is begin if N = 0 then return 1; else return N * Factorial(N - 1); end if; end Factorial;
или используя «if expression» (Ada 2012)
function Factorial (N: Natural) return Natural is begin return (if N = 0 then 1 else N * Factorial(N - 1)); end Factorial;
LaTeX[править]
documentclass{article} usepackage{ifthen} newcounter{multi} newcounter{multa} newcommand{mult}[2]{ setcounter{multi}{1} setcounter{multa}{#1} whiledo{themulti < #2}{ addtocounter{multa}{#1} stepcounter{multi} } } newcounter{faki} newcounter{faka} newcommand{fac}[1]{ setcounter{faka}{1} setcounter{faki}{2} whiledo{thefaki < #1}{ mult{thefaka}{thefaki} setcounter{faka}{themulta} stepcounter{faki}} mult{thefaka}{thefaki} themulta} begin{document} Huge $10!=fac{10}$ end{document}
Java и C#[править]
Рекурсивный метод:
public int fact(int num) { return ((num > 1) ? num * fact(num - 1) : 1); }
Если вы переживаете, что стек может быть переполнен, то используйте не рекурсивный метод:
public static uint Factorial(uint num) { uint fact = 1; while (num > 1) fact *= num--; return fact; }
JavaScript[править]
var factorial = function factorialis (m) { var n = parseInt(m); return (n < 0 || m != n) ? NaN : (n == 0 ? 1 : n * factorialis(n - 1)); }
CoffeeScript[править]
factorial = (n) -> !n and 1 or n * factorial(n - 1);
Python[править]
def factorial(x): return x * factorial(x - 1) if x > 1 else 1
или
factorial = lambda x: x and factorial(x - 1) * x or 1
или
import math math.factorial(x)
или
from functools import reduce factorial = reduce(lambda x, y: x * y, range(1, n + 1)
Refal[править]
Factorial { 0 = 1; s.Value = <Mul s.Value <Factorial <Sub s.Value 1>>>; }
Haskell[править]
factorial :: Integer -> Integer factorial 0 = 1 factorial n | n > 0 = n * factorial (n - 1) factorial _ = error "Факториал не определен для отрицательных чисел"
или
factorial :: Integer -> Integer factorial n = product [1..n]
D[править]
long Factorial(int n) { if (n <= 1) return 1; return n * Factorial(n - 1); }
Нерекурсивные методы[править]
Примеры реализаций нерекурсивных функций для вычисления факториала.
Pascal[править]
function factorial(n : integer) : longint; var i : integer; f : longint; begin f := 1; for i := 2 to n do f := f * i; factorial := f end;
Perl[править]
#!/usr/bin/perl sub factorial { my $f=1; my @fct= $f .. $_[0]; foreach (@fct) {$f*=$_;} $f; }
C/C++[править]
int factorial(int n) { int result = 1; for ( int i = 2; i <= n; i++ ) { result *= i; } return result; }
Java и C#[править]
public static int factorial(int num) { int fact = 1; for (; num > 1; fact *= num--); return fact; }
JavaScript[править]
const factorial = (n) => { if (n < 0) return NaN; let result = 1; for (let i = 1; i <= n; i++) { result *= i; } return result; }
CoffeeScript[править]
factorial = (n) -> res = 1 res *= n-- while n > 1 res
или
factorial = (n) -> [1..n].reduce (x,y) -> x * y || 1
Lisp[править]
(defun factorial (n) (if (< n 1) 1 (do ((f 1) (i 2 (1+ i))) ((> i n) f) (setq f (* f i)))))
Fortran[править]
integer function fact (n) integer n fact = 1 do i = 1,n fact = fact * i enddo return end program factorial integer fact external fact n = 10 write (*,*) n,"! = ",fact(n) end program factorial
Unix Shell[править]
#!/bin/sh result=1 for (( factor=$1 ; $factor ; factor=$factor-1 )) do let -i result=$result*$factor done echo $result
CMD Shell[править]
@echo off set /p n=" n : " set f=1 & for /l %%i in (1,1,%n%) do set /a f=%%i*f echo %f% pause&exit
PHP[править]
function factorial($n) { $result = 1; for ($i=2; $i<=$n; $i++) $result *= $i; return $result; }
или
function factorial($n) { return ($n <= 1) ? 1 : array_product(range(1,$n)); }
Cobol[править]
identification division. program-id. factorial. environment division. data division. working-storage section. 77 result pic 9(8). 77 n pic 9(8). 77 i pic 9(8). procedure division. main-line. display "Enter a positive number: " with no advancing accept n move 1 to result. perform varying i from 1 by 1 until i>n multiply result by i giving result end-perform display "Factorial(" n ")= " result stop run.
Basic[править]
input "N = "; n f=1 for i = 1 to n f=f*i next i print n;"! = ";f
Программируемые калькуляторы «Электроника»[править]
Примечание: команда ВП по адресу 00.
превращает 0 в 1, позволяя корректно вычислять 0! = 1.
Вариант № 1[править]
С использованием счётчика в адресуемом регистре (в качестве r следует выбрать один из регистров: 0, 1, 2, 3).
00. ВП 01. Пr 02. 1 03. ИПr 04. × 05. FLr 06. 03 07. С/П
Вариант № 2[править]
С использованием регистров стека X, Y, Z (значение, находившееся в регистре Y, сохраняется).
00. ВП 01. В↑ 02. КНОП 03. 1 04. − 05. Fx≠0 06. 11 07. × 08. FВx 09. БП 10. 03 11. F⟳ 12. С/П
Вариант № 3[править]
С использованием регистров стека X, Y, Z, T (т. е. стек используется целиком).
00. ВП 01. ↔ 02. FВx 03. В↑ 04. FВx 05. 1 06. - 07. × 08. Fx=0 09. 03 10. ↔ 11. С/П
AT&T x86 Assembler[править]
factorial.s: .globl factorial factorial: movl $1, %eax jmp .L2 .L3: imull 2(%esp), %eax decl 78(%esp) .L2: cmpl $1, 4(%esp) jg .L3 ret factorial-main.c: #include <stdio.h> extern int factorial (int n); int main () { int n = 10; printf ("%d! = %dn", n, factorial (n)); } gcc factorial-main.c factorial.s
Refal+[править]
$func Factorial s.n = s.fact; Factorial s.n = 1 s.n $iter <Mult s.fact s.n> <Sub s.n 1> :: s.fact s.n, s.n : 0 = s.fact;
Ruby[править]
def factorial n (1..n).inject(:*) || 1 end
Без итераторов:
def factorial n f = 1 for i in 2..n f *= i end f end
Python[править]
def factorial(x): return reduce(lambda x, y : x * y, xrange(1, x + 1), 1)
С while циклом:
def factorial(x): res = 1 while x > 0: res *= x x -= 1 return res
С циклом for:
def factorial(a): if a == 0 or a == 1: return 1 else: result = 1 for i in range(2, a + 1): result *= i return result
J[править]
factorial=: */@(>:@i.)
RSL (Object RSL)[править]
Macro factorial (n) if (n < 0) fact = "Enter a positive number"; elif (n == 0) fact = 1; else fact = i = 1; while (i <= n) fact = fact*i; i = i + 1; end; end; return fact; end;
Ada[править]
function Factorial (N: Natural) return Natural is Acc : Natural := 1; begin for I in 2 .. N loop Acc := Acc * I; end loop; return Acc; end Factorial;
См. также[править]
- Язык Си в примерах/Факториал