Программа как найти факториал числа

Факториал числа 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:

  1. Iterative Solution
  2. Recursive Method
  3. Tgamma() Method
  4. 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. Присвоим переменной, накапливающей произведение натуральных чисел, начальное значение 1.
  2. Присвоим переменной-счетчику значение 2.
  3. Пока переменная счетчик не достигнет числа, введенного пользователем,
    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;

См. также[править]

  • Язык Си в примерах/Факториал

Понравилась статья? Поделить с друзьями:
  • Как найти работу алименщика
  • Как исправить не четкость на фото
  • Как найти диаметр окружности вписанной в ромб
  • Эпизод как нашли муму
  • Как составить международную декларацию