C#
- 4 formas distintas de calcular o fatorial
![]() |
Hoje veremos 4 formas diferentes de calcular o fatorial de um número. |
O Fatorial é um número natural inteiro positivo, o qual é representado por n!.
O fatorial de um número é calculado pela multiplicação desse número por todos os seus antecessores até chegar ao número 1.
n! = n.(n-1).(n-2)...3.2.1 |
Exemplo: 5! = 5*4*3*2*1 = 120
Para realizar o cálculo na linguagem C# você deve atentar para o tipo de dados que você pretende usar para obter o resultado.
Os tipos de dados FLOAT, DOUBLE e DECIMAL são usados para armazenar números reais até uma certa precisão.
Qual a diferença entre esses tipos então ?
A tabela abaixo compara o intervalo, precisão, maior inteiro e tamanho:
Tipo | Intervalo | Precisão(Dígitos) |
Maior
Inteiro Exato |
Tamanho |
float | 1.5x10^-45 / 3.4x10^38 | 7 | 2^24 | 4 bytes |
double | 5.0x10^-324 / 1.7x10^308 | 15-16 | 2^53 | 8 bytes |
decimal | 1.0x10^-28 / 7.9x10^28 | 28-29 | 2^113 | 16 bytes |
int |
-2,147,483,648 /2,147,483,647 |
- | - | 16 bytes |
long |
-9.223.372.036.854.775.808 até 9.223.372.036.854.775.807 |
- | - | 32 bytes |
Nota: Além destes tipos temos a struct BigInteger que é um tipo imutável presente no namespace System.Numerics que representa um inteiro arbitrariamente grande cujo valor, em teoria não possui limites superiores ou inferiores.
Só para você ter uma idéia abaixo temos uma tabela de fatoriais até o número 30:
n | n! |
---|---|
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 | 51090942171709440000 |
22 | 1124000727777607680000 |
23 | 25852016738884976640000 |
24 | 620448401733239439360000 |
25 | 15511210043330985984000000 |
26 | 403291461126605635584000000 |
27 | 10888869450418352160768000000 |
28 | 304888344611713860501504000000 |
29 | 8841761993739701954543616000000 |
30 | 265252859812191058636308480000000 |
A seguir vejamos 4 formas diferentes e calcular o fatorial de um número real.
1- Usando o laço for
private static void Fatorial_LoopFor()
{
double i, numero, fatorial;
Console.WriteLine("Informe o número");
numero = double.Parse(Console.ReadLine());
fatorial = numero;
for (i = numero - 1; i >= 1; i--)
{
Console.WriteLine($"{fatorial} * {i}");
fatorial = fatorial * i;
Console.WriteLine($"i={i}");
Console.WriteLine($"fatorial={fatorial}");
Console.WriteLine(" ");
}
Console.WriteLine($"\nFatorial de {numero} é {fatorial} ");
Console.ReadLine();
}
|
Este é o
meio mais simples, e aqui, estou exibindo os cálculos no console.
2-
Usando o laço While
public static double Fatorial_WhileLoop(int
numero) { double resultado = 1; while (numero != 1) { resultado = resultado * numero; numero = numero - 1; } return resultado; } |
Possui menos código que o anterior.
3- Usando recursão
public static
double Fatorial_Recursao(int numero) { if (numero == 1) return 1; else return numero * Fatorial_Recursao(numero - 1); } |
Aqui usamos recursão para simplificar o cálculo.
4 - Usando Delegate Func()
private static void Fatorial_DelegateFunc()
{
Console.WriteLine("Informe o numero");
Func<double, double> fatorial = null;
fatorial = x => x <= 1 ? 1 : x * fatorial(x - 1);
double numero = double.Parse(Console.ReadLine());
var resultado = fatorial(numero);
Console.WriteLine(resultado);
}
|
Para chamar estes cálculos a partir do método Main podemos fazer assim:
static void Main(string[] args) { Console.WriteLine("Recursão " + Fatorial_Recursao(15)); Console.WriteLine("While/loop " + Fatorial_WhileLoop(15)); Fatorial_LoopFor(); Fatorial_DelegateFunc(); Console.ReadLine(); } |
Executando o projeto e fazendo o teste com o fatorial do número 15 iremos obter o resultado abaixo:
E estamos conversados...
"Portanto, cingindo os lombos do vosso entendimento, sede sóbrios, e
esperai inteiramente na graça que se vos ofereceu na revelação de Jesus
Cristo;"
1 Pedro 1:13
Referências:
NET - Expressões Lambdas - Macoratti.net
C# - Usando a biblioteca Math.NET - I - Macoratti.net
VB .NET - Permutações - Macoratti.net
C # - Avaliando Expressões - Macoratti.net
C# - Resolvendo 10 problemas de matemática ... - Macoratti.net