Cálculo número combinatorio

De Ejercicios

Contenido

Enunciado

Realizar el diseño y programa capaces de calcular el combinatorio de dos números a y b:

                        a!
          C(a,b) = -------------
                     b! * (a-b)!

Soluciones

Diseño en Pseudocódigo

Diseño 1 por lperez

 FUNCION Factorial (n): ENTERO
 ENTRADAS: n: ENTERO, un número entero positivo.
 SALIDAS: el factorial de n.
 VARIABLES: i, f: ENTERO
 INICIO
   f<--1
   PARA i=2 HASTA n HACER
      f<--f *i
   FIN_PARA
   DEVOLVER   f
 FIN
 *********************************************
 ALGORITMO Combinatorio
 ENTRADAS: a, b: ENTERO, dos número entero positivos, a>0, b>=0 y a>b .
 SALIDAS: combi: ENTERO, el número combinatorio a sobre b, calculado de la forma:
                          a!
           C(a,b) = -------------
                      b! * (a-b)!
 VARIABLES: fa, fb, fab:ENTERO
 INICIO
   LEER a,b
   SI ( ( b = 0 ) or ( a = b ) )
   ENTONCES
      combi<--1
   SI NO
      combi<--Factorial(a)/(Factorial(b)*Factorial(a-b))
   FIN_SI   
   ESCRIBIR combi 
 FIN

Diseño 2 por lperez

 PROCEDIMIENTO Factorial (n, VAR f)
 ENTRADAS: n: ENTERO, un número entero positivo.
 SALIDAS: f: ENTERO, el factorial de n.
 VARIABLES: i: ENTERO.
 INICIO
   f<--1
   PARA i=2 HASTA n HACER
      f<--f *i
   FIN_PARA
 FIN
 ********************************************************************
 ALGORITMO Combinatorio
 ENTRADAS: a, b: ENTERO, dos número entero positivos, a>0, b>=0 y a>b .
 SALIDAS: combi: ENTERO, el número combinatorio a sobre b, calculado de la forma:
                      a!
        C(a,b) = -------------
                   b! * (a-b)!
 VARIABLES: fa, fb, fab:ENTERO
 INICIO
   LEER a,b
   SI ( ( b = 0 ) or ( a = b ) )
   ENTONCES
      combi<--1
   SI NO
      Factorial(a,fa)
      Factorial(b,fb)
      Factorial(a-b,fab)
      combi<--fa/(fb*fab)
   FIN_SI   
   ESCRIBIR combi 
 FIN

Comentario

En la primera solución se ha utilizado una función para resolver el factorial, mientras que en la segunda se ha utilizado un procedimiento.

Programa en C

Solución 1

 //''(Este programa se ha hecho con una función)''            
 int Factorial(int n){
   //ENTRADAS: ''(n: un número entero positivo)''
   //SALIDAS: ''(El factorial de n)''
   //VARIABLES
   int i, f;
 
   f=1;
   for(i=2; i<=n; i++){
       f=f*i;
   }
   return(f);
 }
 //*******************************************************
 
 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void){
   //ENTRADAS
   int a, b; //''(Dos numeros enteros positivos: a>0, b>=0, a>b)''
   //SALIDAS
   int combi; //''(El numero combinatorio a sobre b calculado de la forma:
   /*                                                                                        
                               a!
                     c(a,b)=----------- )''
                             b!*(a-b)!                                     
   */
   //VARIABLES
   int fa,fb,fab;
 
   printf("Introduzca dos numeros enteros positivos: ");
   scanf("%i %i", a, b);
    if((b==0)||(a==b)){
        combi=1;
    }else{
        combi=Factorial(a)/(Factorial(b)*Factorial(a-b));
    }
    printf("%i",combi);
 }

Solución 2

  void Factorial(int n, int &f){
    //VARIABLES
    int i;
 
    f=1;
    for(i=2; i<=n; i++){
       f=f*i;
    }
  }
 //**********************************
 #include<stdio.h>
 #include<stdlib.h>
 
 int main(void){
 //ENTRADAS
   int a, b;  //''(Dos numeros enteros positivos: a>0, b>=0, a>b)''
 //SALIDAS
   int combi; /*''(El numero combinatorio a sobre b calculado de la forma:
 
                               a!
                     c(a,b)=----------- )''
                             b!*(a-b)!  
              */                                   
  //VARIABLES
    int fa, fb, fab;
 
    printf("Introduzca dos numeros enteros positivos: ");
    scanf("%i %i", a, b);
    if((b==0)||(a==b)){
        combi=1;
    }else{
        Factorial(a,fa);
        Factorial(b,fb);
        Factorial(a-b,fab);
        combi=fa/(fb*fab);
    }
    printf("%i",combi);
  }

Comentario

En la primera solución se ha utilizado una función para resolver el factorial, mientras que en la segunda se ha utilizado un procedimiento.

Programa en Pascal por lperez

 program Combinatorio;
 {ENTRADAS: a,b, dos n£meros enteros positivos, a>b y a<>0
 SALIDAS: combi, el n£mero combinatorio a sobre b, calculado de la forma:
                       a!
        C(a,b) = -------------
                  b! * (a-b)!
 }
 uses crt;
 (****************************************************)
 procedure Lectura(var n, m:integer);
 {ENTRADAS: Ninguna;
 SALIDAS: n y m, dos n£meros enteros que cumplen que n>0, m>=0 y n>m}
 begin
   {repite la entrada de los datos hasta conseguir que n sea un entero positivo,
     m sea positivo o 0 y n sea mayor que m}
  repeat
     clrscr;
     writeln('Este programa calcula un el n£mero combinatorio n sobre m');
     writeln('              n!');
     writeln('C(n,m) = -------------');
     writeln('           m! * (n-m)!');
     writeln('Reglas de utilizaci¢n: ');
     writeln('      El primer operando ha de ser mayor que 0');
     writeln('      El segundo operando ha de ser mayor o igual que 0');
     writeln('      El primer operando ha de ser mayor o igual que el segundo');
     write('Introduce el primer operando: ');
     readln(n);
     write('Introduce el segundo operando:') ;
     readln(m);
  until (n>=m) and (n>0) and (m>=0);
 end;
 (****************************************************************)
 function factorial(n:integer):integer;
 {ENTRADAS: n, un número entero positivo
 SALIDAS: el factorial de n}
 var i,f:integer;
 begin
  f:=1;
  for i:=1 to n do
    f:=f*i;
  factorial:=f;
 end;
 (*****************************************************************)
 procedure factorial2(n:integer;var f:integer);
 {ENTRADAS: n, un número entero positivo
 SALIDAS: f, el factorial de n}
 var i:integer;
 begin
  f:=1;
  for i:=1 to n do
    f:=f*i;
 end;
 (***************************************************************)
 {variables LOCALES del programa principal}
 var a,b,combi:integer;opcion:char;
    fa,fb,fab:integer; {estas variables son necesarias si se utiliza el
                        procedimiento para calcular el factorial}
 begin
  repeat  {repite el programa hasta que se pulsa el caracter n};
    Lectura(a,b);
    { C(a,0) = C(a,a) = 1. En este caso no es necesario llamar al subprograma
       que calcula el factorial }
    if ( ( b = 0 ) or ( a = b ) )
    then
       begin
        combi := 1;
       end
    else
      begin
         factorial2(a,fa);    {llamadas }
         factorial2(b,fb);     {al}
         factorial2(a-b,fab); {procedimiento }
         combi:= fa DIV (fb*fab);
         {combi:=factorial(a)/(factorial(b)*factorial(a-b))  llamada a la funci¢n
          si utilizamos la función la línea anterior comentada sustituye a las
          4 líneas anteriores}
      end;
    writeln('Combinatorio( ',a,',',b,')=',combi);
    write('Pulsa n para acabar y otro para repetir  ');
    readln(opcion);
  until opcion='n';
 end.

Comentario

Tal y como está el programa anterior, utiliza el procedimiento para resolver el cálculo del factorial. Si se quiere utilizar la función se tendría que quitar de comentario la línea que lo hace y se tendría que comentar las líneas de llamadas al procediemiento.

Programa en Matlab

Para realizar este programa utilizamos el módulo factorial existente en Matlab.

%Programa CalcularCombinatorio
%Descripción: Calcula el combinatorio de dos números a y b, de la forma:
%                          a!
%           C(a,b) = -------------
%                      b! * (a-b)!
%Entradas: Dos números enteros.
%Salidas:El combinatorio de los dos números.
%Variables:
%   a,b,c,res:ENTEROS
%   texto:CADENA (o ARRAY) DE CARACTERES.
 
a = input('Introduzca el primer valor:');
b = input('Introduzca el segundo valor:');
%Asignar a la variable a el mayor valor
if a<b
    c=a;
    a=b;
    b=c;
end
%Calculamos el combinatorio si es posible
if b==0 || a==b
    res = -1;
else
    res = factorial(a)/(factorial(b)*factorial(a-b));
end    
texto=['el combinatorio es: ' num2str(res)];
disp(texto);
Tipos de soluciones