Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Multiplicar "N" Factoriales ? (https://www.clubdelphi.com/foros/showthread.php?t=61061)

luisagpe 23-10-2008 19:18:19

Multiplicar "N" Factoriales ?
 
Hola! gente pues mi nombre es Luisa y soy nueva en Delphi y en el foro :P
asi que vine a preguntar, estoy haciendo un programa en el que se resuelven formulas de probabilidad y una de ellas me pide la multiplicacion de "N" factoriales, es decir los que el usuario quiera...
esto de aqui es el codigo con que saco el primer factorial :D

Código Delphi [-]
procedure TFormClasif1.btnCalcularFac1Click(Sender: TObject); 
var 
   n, factorial,i:integer; 
begin   
   n:=strtoint(edit1.Text);   
   factorial:=1; 
for 
   i:=1 to n do   factorial:=factorial*i;   
   ResN.Caption:=inttostr(factorial); 
end;


Ahora la cosa que me estaba preguntando es como le puedo hacer
para que el usuario pueda meter cuantos factoriales quiera, (bueno números a los que les quiera sacar el factorial) y multiplicarlos para después tener un resultado..

solo quiero una ideita :P
de como puedo hacerlo espero me puedan ayudar:p

saludos!

rgstuamigo 23-10-2008 20:06:52

Hola luisagpe, Bienvenida al foro.
Pero dime: ¿A que terefieres con multiplicar n factoriales? :confused:no te entiendo , podrias hacer un ejemplo o ser un poco mas explicativa, para poder ayudarte;).

luisagpe 23-10-2008 20:11:37

mmm....
digamos que necesito sacar varios factoriales (los que el usuario desee, no se como hacer eso >.<)
luego de obtener todos esos factoriales multiplicarlos... por ejemplo:
ingreso el 5,4,3y 2
el factorial de esos seria
5=120
4=24
3=6
2=2

lo que quiero que al final haga es obtener
120*24*6*2

Fenareth 23-10-2008 20:17:05

Hola luisagpe !

Bienvenida al foro :)...

Se me ocurre que puedas tener algún tipo de acumulador que vaya haciendo la multiplicación del factorial que vaya ingresando el usuario...

El acumulador comenzaría en 1... si el usuario introduce por ejemplo del 5! = 120, entonces el acumulador haría algo como

Código Delphi [-]
acumulador := acumulador * resultado_factorial;

después de eso limpias la variable resultado_factorial y está lista para que el usuario siga introduciendo tantos factoriales como desee...

Espero te sea de ayuda ! Cualquier duda hazla saber ;)

P.D. Si no lo has hecho, date una vuelta por la guía de estilo :)

coso 23-10-2008 20:35:01

Hola luisa,

Código Delphi [-]

function Factorial(n : integer) : integer;
begin
        result := 1;
        if n = 1 then exit;
        result := n*Factorial(n-1);
end;

procedure Form1.Button1Click(sender : TObject);
var
         i,n : integer;
begin
         n := 1;      
         for i := 0 to Memo1.Lines.Count - 1 do
              n := n*Factorial(strtoint(Memo1.Lines[i]));

         ShowMessage(inttostr(n));
end;

en el memo1 se pondrian los numeros de los cuales se quiere el producto de sus factoriales.

rgstuamigo 23-10-2008 21:13:01

Corrigiendo un poquito..
Código Delphi [-]
function Factorial(n : integer) : LongWord;
begin
        result := 1;
        if (n = 1)or(n = 0) then exit;//factorial de cero=1 por definicion
        result := n*Factorial(n-1);
end;
Hay que tener en cuenta tambien el tipo de dato que devuelve la funcion Factorial por que si es un tipo pequeño, los resultados no serian los mismo ya que esta funcion factorial es una funcion progresivamente enorme.
Por ejemplo el Factorial(31)=738197504. si saco el Factorial(32), ya no me soporta el tipo LongWord, me saldria un valor distinto al deseado o un error. :cool:
Saludos......;)

luisagpe 23-10-2008 21:14:15

[FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif]Hola chicos gracias por la ayuda, se me hizo mas sencillo utilizar un acumulador, o por lo menos eso pensé... si aqui vengo a molestar otra vez ^^U les pondré como luce mi pantalla y el codigo completo del botón;



lo que completamente debe hacer esto es realizar la formula que esta en imagen dentro del formulario, una explicación sencilla;

n!= un solo factorial
r1, r2, r3... rn = muchos factoriales multiplicados entre si

al final se hace un división... pero el programa me marca un error que no comprendo -.-


[/font]

luisagpe 23-10-2008 21:18:48

Me olvide de poner mi codigo :p
Código Delphi [-]
[FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif] procedure TFormClasif1.btnCalcularFac1Click(Sender: TObject);
var
  n, n2, factorial, factorial2, i, i2, acumulador, RS:integer;
begin
  n:=strtoint(edit1.Text);
  n2:=strtoint(edrs.Text);
  acumulador := 1;
  factorial := 1;
  factorial2 := 1;
for i:=1 to n do
  factorial := factorial*i;
  ResN.Caption := inttostr(factorial);
for i2 :=1 to n2 do
  factorial2 := factorial2*i2;
  acumulador := acumulador*factorial2;
  factR.Caption:=inttostr(acumulador);
  RS := factorial / factorial2;
  resultadoFinal.Caption:=inttostr(RS);
 end;[/font]

coso 23-10-2008 21:28:23

el error te sale porque rs no debe ser entero. Debe ser de tipo double, ya que contendra un decimal.

coso 23-10-2008 21:31:50

ten en cuenta tambien que tu codigo no esta haciendo n!/(r1!r2!...rn!) sino n!/n2! Tal como te decia (incluida la correcion de rgst, y teniendo en cuenta tambien lo del overflow del integer, esto es, valores demasiado grandes) lo mejor seria una funcion factorial aparte, y llamarla al necesitarla.

coso 23-10-2008 21:34:35

y aun por otra banda, tienes
Código:


    n!                      n!
__________  y luego        ___
r1!r2!..rn!                rn!

tu codigo estaba calculando la segunda formula. ¿Cual es la que quieres calcular?

luisagpe 23-10-2008 21:39:12

segunda formula O.o!
no.. es solo una, es solo que se tiene que resolver lo de abajo y lo arriba :P
he cambiado a double RS y ahora marca un error diferente en esta linea

Código Delphi [-]
resultadoFinal.Caption:=(RS);
me dice que son incompatible los tipos Strings y double
¿no puedo hacer operaciones con labels?
creo que ese es mi problema, pero no se bien -.-

coso 23-10-2008 21:43:08

si es la segunda formula es tansolo una divison de factoriales

entoces seria

Código Delphi [-]
var
rs : double
begin
....
rs := factorial(n)/factorial(n2);
ResultadoFinal.Caption := FormatFloat('0.00000000',rs);
...

ten en cuenta que n!/(r1!r2!...rn!) es diferente de n!/rn!. En el primero se supone que hay n erres, mientras que en el segundo que tansolo hay una rn.

luisagpe 23-10-2008 21:58:26

bien bien... agregando la función factorial que puso rgstuamigo y corrigiendo la operación como me dijiste... al parecer la división ya sale, la cosa ahora es (gomen soy nueva en Delphi -.-) que despues de calcular eso
introduzco un nuevo valor en el campo edrs y no se suma al anterior... al parecer mi acumulador no me funciona ToT

coso 23-10-2008 22:12:34

lo siento, no te entiendo :confused:

luisagpe 23-10-2008 22:14:40

Ahh... perdon soy mala explicando =P
veras lo que pasa es que en la parte de abajo de la formula son muchos factoriales, que despues de haber obtenido quiero multiplicar, por eso me sugirieron un acumulador, pero no me esta funcionando...

coso 23-10-2008 22:15:17

entonces....quieres calcular n!/(r1!r2!...rn!)?

luisagpe 23-10-2008 22:16:42

exactamente, ese es el objetivo... :D
soy mala explicando perdon -.-

coso 23-10-2008 22:20:22

el primer codigo que te puse te calcula los r1!r2!...rn!. Estos deberan estar en un Memo (componente), por ejemplo.

Código Delphi [-]
function Factorial(n : integer) : integer;
begin
        result := 1;
        if abs(n) > 2 then exit;
        result := n*Factorial(n-1);
end;

function R1R2RN : longint;
var
         i : integer;
begin
         result := 1;      
         for i := 0 to Memo1.Lines.Count - 1 do
              result := result*Factorial(strtoint(Memo1.Lines[i]));
end;
 
procedure Button1Click(sender : TObject);
begin
         resultadofinal.Caption := strtofloat(Factorial(Edit1.Text) / R1R2RN);
end;

rgstuamigo 23-10-2008 22:32:01

Hola luisagpe de nuevo. entonces lo que estas queriendo hacer es Permutaciones sin repeticiones donde la formula es:

donde n es el número de cosas que puedes elegir, y eliges r de ellas
(No se puede repetir, el orden importa)
¿Es eso lo que quieres?:confused:


La franja horaria es GMT +2. Ahora son las 09:05:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi