Encontrar el subfactorial de un número

Dado un número entero N, la tarea es encontrar el subfactorial del número representado como !N. El subfactorial de un número se define usando la siguiente relación de recurrencia de un número N :

!N = (N-1) [ !(N-2) + !(N-1) ]

donde !1 = 0 y !0 = 1

Algunos de los subfactoriales son:

norte 0 1 2 3 4 5 6 7 8 9 10 11 12 13
! norte 1 0 1 2 9 44 265 1, 854 14, 833 133, 496 1, 334, 961 14, 684, 570 176, 214, 841 2, 290, 792, 932

Ejemplos:

Entrada: N = 4
Salida: 9
Explicación: 
!4 = !(4-1)*4 + (-1) 4 = !3*4 + 1
!3 = !(3 – 1)*3 + (-1) 3 = !2*3 – 1
!2 = !(2 – 1)*2 + (-1) 2 = !1*2 + 1
!1 = !(1 – 1)*1 + (-1) 1 = !0*1 – 1
Dado que !0 = 1, por lo tanto, !1 = 0, !2 = 1, !3 = 2 y !4 = 9. 

Entrada: N = 0
Salida: 1

 

Enfoque: El subfactorial del número N también se puede calcular como:

{\displaystyle !n={\begin{cases}1&{\text{if }}n=0, \\n\left(!(n-1)\right)+(-1)^{n}&{\text{if }}n>0.\end{cases}}}

Expandiendo esto da

{\displaystyle !n=\sum _{i=0}^{n-1}i(!i)+{\frac {1+(-1)^{n}}{2}}}

=> !N = ( N! )*( 1 – 1/(1!) + (1/2!) – (1/3!) …….. (1/N!)*(-1) N )

Por lo tanto, la serie anterior se puede usar para encontrar el subfactorial del número N. Siga los pasos a continuación para ver cómo:

  • Inicialice las variables, digamos res = 0 , fact = 1 y count = 0 .
  • Itere sobre el rango de 1 a N usando i y haga lo siguiente:
    • Actualizar hecho como hecho*i.
    • Si el recuento es par , actualice res como res = res – (1 / fact) .
    • Si el recuento es impar , actualice res como res = res + (1 / fact) .
    • Aumente el valor de la cuenta en 1.
  • Finalmente, devuelve fact*(1 + res) .

A continuación se muestra la implementación del enfoque anterior:

C++

/// C++ program for the above approach
#include <iostream>
using namespace std;
 
// Function to find the subfactorial
// of the number
double subfactorial(int N)
{
 
    // Initialize variables
    double res = 0, fact = 1;
    int count = 0;
 
    // Iterating over range N
    for (int i = 1; i <= N; i++) {
 
        // Fact variable store
        // factorial of the i
        fact = fact * i;
 
        // If count is even
        if (count % 2 == 0)
            res = res - (1 / fact);
        else
            res = res + (1 / fact);
 
        // Increase the value of
        // count by 1
        count++;
    }
 
    return fact * (1 + res);
}
 
// Driver Code
int main()
{
    int N = 4;
    cout << subfactorial(N);
 
    return 0;
}

Java

/// Java program for the above approach
import java.util.*;
 
class GFG {
 
    // Function to find the subfactorial
    // of the number
    static double subfactorial(int N)
    {
 
        // Initialize variables
        double res = 0, fact = 1;
        int count = 0;
 
        // Iterating over range N
        for (int i = 1; i <= N; i++) {
 
            // Fact variable store
            // factorial of the i
            fact = fact * i;
 
            // If count is even
            if (count % 2 == 0)
                res = res - (1 / fact);
            else
                res = res + (1 / fact);
 
            // Increase the value of
            // count by 1
            count++;
        }
 
        return fact * (1 + res);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int N = 4;
        System.out.println((int)(subfactorial(N)));
    }
}
 
// This code is contributed by ukasp.

Python3

# python program for the above approach
 
# Function to find the subfactorial
# of the number
def subfactorial(N):
 
        # Initialize variables
    res = 0
    fact = 1
    count = 0
 
    # Iterating over range N
    for i in range(1, N+1):
 
                # Fact variable store
                # factorial of the i
        fact = fact * i
 
        # If count is even
        if (count % 2 == 0):
            res = res - (1 / fact)
 
        else:
            res = res + (1 / fact)
 
            # Increase the value of
            # count by 1
        count += 1
 
    return fact * (1 + res)
 
# Driver Code
if __name__ == "__main__":
 
    N = 4
    print(subfactorial(N))
 
    # This code is contributed by rakeshsahni

C#

/// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the subfactorial
// of the number
static double subfactorial(int N)
{
 
    // Initialize variables
    double res = 0, fact = 1;
    int count = 0;
 
    // Iterating over range N
    for (int i = 1; i <= N; i++) {
 
        // Fact variable store
        // factorial of the i
        fact = fact * i;
 
        // If count is even
        if (count % 2 == 0)
            res = res - (1 / fact);
        else
            res = res + (1 / fact);
 
        // Increase the value of
        // count by 1
        count++;
    }
 
    return fact * (1 + res);
}
 
// Driver Code
public static void Main()
{
    int N = 4;
    Console.Write(subfactorial(N));
}
}
 
// This code is contributed by ipg2016107.

Javascript

<script>
        // JavaScript Program to implement
        // the above approach
 
        // Function to find the subfactorial
        // of the number
        function subfactorial(N) {
 
            // Initialize variables
            let res = 0, fact = 1;
            let count = 0;
 
            // Iterating over range N
            for (let i = 1; i <= N; i++) {
 
                // Fact variable store
                // factorial of the i
                fact = fact * i;
 
                // If count is even
                if (count % 2 == 0)
                    res = res - 1 / fact;
                else
                    res = res + 1 / fact;
 
                // Increase the value of
                // count by 1
                count++;
            }
 
            return fact * (1 + res);
        }
 
        // Driver Code
        let N = 4;
        document.write(subfactorial(N));
 
// This code is contributed by Potta Lokesh
    </script>
Producción

9

Complejidad temporal: O(N)
Espacio auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por vedant280 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *