Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
Question 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

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

saludos!
Responder Con Cita
  #2  
Antiguo 23-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

Hola luisagpe, Bienvenida al foro.
Pero dime: ¿A que terefieres con multiplicar n factoriales? no te entiendo , podrias hacer un ejemplo o ser un poco mas explicativa, para poder ayudarte.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #3  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 23-10-2008
Avatar de Fenareth
[Fenareth] Fenareth is offline
Miembro Premium
 
Registrado: oct 2007
Ubicación: Guadalajara, Jalisco, México
Posts: 494
Poder: 17
Fenareth Va por buen camino
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
__________________
Ask questions. Think for yourself. Wake up and you’ll make the difference
Responder Con Cita
  #5  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 23-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

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.
Saludos......
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
[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]
Responder Con Cita
  #8  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
Me olvide de poner mi codigo
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]
Responder Con Cita
  #9  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
el error te sale porque rs no debe ser entero. Debe ser de tipo double, ya que contendra un decimal.
Responder Con Cita
  #10  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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?
Responder Con Cita
  #12  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
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 -.-
Responder Con Cita
  #13  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.

Última edición por coso fecha: 23-10-2008 a las 21:49:27.
Responder Con Cita
  #14  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
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
Responder Con Cita
  #15  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
lo siento, no te entiendo
Responder Con Cita
  #16  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
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...
Responder Con Cita
  #17  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
entonces....quieres calcular n!/(r1!r2!...rn!)?
Responder Con Cita
  #18  
Antiguo 23-10-2008
Avatar de luisagpe
luisagpe luisagpe is offline
Miembro
 
Registrado: oct 2008
Posts: 13
Poder: 0
luisagpe Va por buen camino
exactamente, ese es el objetivo...
soy mala explicando perdon -.-
Responder Con Cita
  #19  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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;
Responder Con Cita
  #20  
Antiguo 23-10-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

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?
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
"ChequeaEsto" elegido el futuro "Killer CLubDelphi" mamcx Noticias 51 31-10-2006 20:56:32
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16


La franja horaria es GMT +2. Ahora son las 13:57:50.


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
Copyright 1996-2007 Club Delphi