Sunteți pe pagina 1din 4

import java.util.

ArrayList;

import javax.swing.JOptionPane;

public class Stirling2 {

public static void main(String[] args) {

int p=Integer.parseInt(JOptionPane.showInputDialog("Ingrese un
valor "));

int s=Integer.parseInt(JOptionPane.showInputDialog("Ingrese un
valor "));

int n;
int m;
/**
* Los 2 condicionales siguientes detectan cuando un numero es
mayor que otro
*/

if(s==p){

n=p;// numero menor


m=s;// numero mayor

if(m<=12&&n<=12&&m>=1&&n>=1){
System.out.println("El valor de m="+m);
System.out.println("El valor de n="+n);

System.out.println("El numero de veces que podemos distribuir


"+m+" objetos"+" en "+n+" recipientes identicos"+" sin que quede ninguno vacio
es="+Stirling(m,n));
}else
JOptionPane.showMessageDialog(null, "Los valores ingresados
no estan dentro de los rangos permitidos, por favor ingrese nuevamente los
valores correctos", null, 0, null);
}

if(s>p){

n=p;// numero menor


m=s;// numero mayor

if(m<=12&&n<=12&&m>=1&&n>=1){
System.out.println("El valor de m="+m);
System.out.println("El valor de n="+n);

System.out.println("El numero de veces que podemos distribuir


"+m+" objetos"+" en "+n+" recipientes identicos"+" sin que quede ninguno vacio
es="+Stirling(m,n));
}else
JOptionPane.showMessageDialog(null, "Los valores ingresados
no estan dentro de los rangos permitidos, por favor ingrese nuevamente los
valores correctos", null, 0, null);
}

if(p>s){

n=s;// numero menor


m=p;// numero mayor

if(m<=12&&n<=12&&m>=1&&n>=1){

System.out.println("El valor de m="+m);


System.out.println("El valor de n="+n);

System.out.println("El numero de veces que podemos distribuir


"+m+" objetos"+" en "+n+" recipientes identicos"+" sin que quede ninguno vacio
es="+Stirling(m,n));

}else
JOptionPane.showMessageDialog(null, "Los valores ingresados
no estan dentro de los rangos permitidos, por favor ingrese nuevamente los
valores correctos", null, 0, null);

}
}

/**
*
* @param m
* @param n
* @return. 1/n!*Σ [(-1)^k]*[(nCn-k)]*[(n-k)^m]
*/
public static long Stirling(int m, int n)
{

long f= factorial(n);//n!

//double g= (long) (1/f);//(1/n!)

int a;// (-1)^k

int c;//(n-k)

long b;//(nCn-k)

long d;//(n-k)^m

long e;//[(-1)^k]*[nCn-k]*[(n-k)^m]

long sumar=0;
ArrayList<Long> suma= new ArrayList<Long>();

for (int k = 0; k <=n; k++)// Este ciclo es el equivalente a la


sumatoria desde k=0 hasta n "Σ"
{
a=(int) Math.pow(-1, k);//calcula la potencia de (-1)^k

b= combinar(n,k);// Realiza la combinacion entre n y n-k

c=n-k;//Resta a n el valor de k

d= (long) Math.pow(c, m); // a la resta entre n y k se eleva


a la potencia m

e=(long) (a*b*d);//[(-1)^k]*[nCn-k]*[(n-k)^m]

suma.add((long) e);// El valor de cada iteracion de k se


agrega a una lista

for (int i = 0; i < suma.size(); i++)


{

sumar+= suma.get(i);// se realiza la suma de cada iteraccion


de k

return (sumar/f);//La suma anterior se multiplica por 1/n!


}
/**
* Metodo que calcula la combinacion entre dos cantidades.
* @param n: Conjunto de n elementos
* @param r: Combinaciones de r
* @return. Retorna la combinacion entre las dos cantidades.
*/
public static long combinar(int n, int r)
{
long a= factorial(n);
long b= factorial(n-r);
long c= factorial(r);
long d=b*c;
long e=a/d;

return e;
}
/**
* Metodo que calcula el factorial de un numero
* @param numero. Parametro que recibe el metodo para calcular el
factorial
* @return. retorna el factorial del número
*/
public static long factorial(int numero)
{
if (numero==0)
return 1;
else
return numero*(factorial(numero-1));
}

S-ar putea să vă placă și