Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   La Taberna (https://www.clubdelphi.com/foros/forumdisplay.php?f=40)
-   -   Para el que este aburrido y tenga ganas de pensar 2 (https://www.clubdelphi.com/foros/showthread.php?t=37518)

marceloalegre 15-11-2006 15:33:29

Para el que este aburrido y tenga ganas de pensar 2
 
Buenas, les paso otro para seguir con esta serie de divertimentos para ejercitar un poquito la mente :) , este me salio facil no le veo problema pero bueno, se los pongo como salio en el diario. Eso sí, lo podemos complicar mas!, si alguien se anima a hacerlo en delphi ( :eek: ), yo despues les puedo pasar los fuentes pero en java de la rta, porque tuve un problemilla al querer hacerlo con nuestro querido lenguaje...

Problema:

"Sea X el maximo nro de 20 digitos de la sucesion de Fibonacci"

enviar mail a rh@x.com

Saludos!

Ñuño Martínez 15-11-2006 16:10:02

Cita:

Empezado por kanvictor
(...) porque tuve un problemilla al querer hacerlo con nuestro querido lenguaje...

Problema:

"Sea X el maximo nro de 20 digitos de la sucesion de Fibonacci"

Normal que tuvieras problemas. ¿Hay algún tipo o clase que maneje números de 20 dígitos? A mi se me ocurre una solución usando Delphi, un tanto bruta pero bueno: BCD. A ver quién lo pilla. (Seoane, intenta reprimirte a ver si lo conseguimos alguno de nosotros, anda ;)).

marceloalegre 15-11-2006 16:52:00

Efectivamente Ñuño ese es el tema :) no lo dije porque era obvio a la vista que estamos con un tratando con tipo de datos que no tenemos para esta cuestion. Eso es algo que le falta a nuestra querida herramienta no? ... :(

Y si, seguro que Seoane va a participar en esta tambien :D , asi que el que le tenga ganas, que se apure!!! :rolleyes:

seoane 15-11-2006 17:28:09

:D Podemos usar el tipo TSuperlargo del que ya te hable en el otro hilo.

Código Delphi [-]
type
  TSuperLargo = array[0..30] of Byte;

function AddSuper(var a,b: TSuperLargo; Acarreo: Integer): TSuperLargo; overload;
var
  i,j: integer;
begin
  for i := 0 to 30 do
  begin
    j:= (Integer(a[i]) + Integer(b[i])) + Acarreo;
    Result[i]:= j mod 10;
    Acarreo:= j div 10;
  end;
end;

function AddSuper(a,b: TSuperLargo): TSuperLargo; overload;
begin
  Result:= AddSuper(a,b,0);
end;

function SuperToStr(a: TSuperLargo): string;
var
  i: integer;
  flag: Boolean;
begin
  Result:= '';
  flag:= FALSE;
  for i := 30 downto 0 do
  begin
    if flag then
      Result:= Result + IntToStr(a[i])
    else if a[i] > 0 then
    begin
      flag:= TRUE;
      Result:= Result + IntToStr(a[i]);
    end;
  end;
end;

// El algoritmo del fibonacci es un pelin cutre, lo se
function fibonacci(n: integer): string;
var
  i,j,k: TSuperLargo;
  Str: string;
begin
  FillChar(i,Sizeof(i),0);
  FillChar(j,Sizeof(j),0);
  FillChar(k,Sizeof(k),0);
  i[0]:= 1;
  j[0]:= 1;
  Result:= '';
  while Result = '' do
  begin
    k:= j;
    j:= AddSuper(i,j);
    i:= k;
    Str:= SuperToStr(j);
    if Length(Str)>n then
      Result:= SuperToStr(i);
  end;
end;


// Por ejemplo
ShowMessage(fibonacci(20));

La respuesta es:
x = 83621143489848422977

Ñuño Martínez 15-11-2006 17:45:34

Envidiaenvidiaenvidia...
 
Estoy empezando a odiarte, macho... :mad::p:rolleyes:

marceloalegre 15-11-2006 18:17:37

jajjajajajajaja Sabia que Domingo la tenia que contestar! porque el fue el que me contesto lo del tipo superlargo!!

Les dije!, le gano de mano a los demas! jajAj! felicitaciones de nuevo!

A ver si alguno se anima y colabora con un:
"Para el que este aburrido y tenga ganas de pensar 3"

marceloalegre 16-11-2006 13:41:35

Por cierto, lo que queria sacar a relucir con esto, es que pese a que tengo puesta la camiseta de Delphi (obviamente), la funcion en java es mucho mas simple:
Código:

import java.math.*;
public class Fibo {

 public static void main(String args[])
 {
  BigDecimal last1 = new BigDecimal("0");
  BigDecimal last2 = new BigDecimal("1");
  BigDecimal aux;
  for (; ;) {
    aux = last1.add(last2);
    last1 = last2;
    last2 = aux;
    if (aux.toString().length() == 21) return;      System.out.println(aux);
  }
 
 }
}

Borland, si me escuchas, poné tipos de datos mas grandes !!! que nunca se saben cuando nos pueden ser utiles...
O contraten a Domingo Seoane para que les de un poco de asesoramiento ;)

Saludos.

Bicho 16-11-2006 16:58:17

No es justo, entre éste hombre que no da tiempo a que los resolvamos nosotros y yo que estoy de vacaciones y con un poco de resaca de las fiestas del pueblo, es que no llego a nada :mad:
A ver si dejais un poco pa' los demás "agoniosos" :D

Saludos

roman 16-11-2006 20:55:31

Cita:

Empezado por kanvictor
Por cierto, lo que queria sacar a relucir con esto, es que pese a que tengo puesta la camiseta de Delphi (obviamente), la funcion en java es mucho mas simple:

Hombre, no es por nada pero es que este problema es trivial. Lo que quiero decir es que la dificultad real del problema consiste justamente en que no todos los lenguajes tendrán enteros tan largos (o aunque los tengan, pues Delphi cuenta con los BCD), de manera que el problema está en ingeniárselas sin ellos, tal y como hizo seoane.

// Saludos

seoane 16-11-2006 21:20:03

Cita:

Empezado por roman
Hombre, no es por nada pero es que este problema es trivial. Lo que quiero decir es que la dificultad real del problema consiste justamente en que no todos los lenguajes tendrán enteros tan largos (o aunque los tengan, pues Delphi cuenta con los BCD), de manera que el problema está en ingeniárselas sin ellos, tal y como hizo seoane.

// Saludos

:o No conocía los BCD, me siento como si me pusiera a reinventar la rueda. Con lo contento que estaba yo con mis superlargos, ya les tenia la multiplicación y la resta :D

roman 16-11-2006 21:27:59

Pero es que cuando yo vi tu respuesta estuve a punto de mencionar algo del estilo de ¿por qué mejor no usan BCDs en lugar de reinventar la rueda?, pero, en un segundo pensamiento me di cuenta que justamente así no tenía ningún chiste el problema y por ello lo interesante fue precisamente tus enteros superlargos.

// Saludos

Ñuño Martínez 16-11-2006 21:32:39

Pues yo tampoco sabía que Delphi incluye una implementación de BCD. Aunque, ahora que lo pienso, todos nos estamos refiriendo a Binario Codificado en Decimal, ¿verdad? Sólo para estar seguro.

marceloalegre 17-11-2006 13:05:13

Cita:

Empezado por roman
Hombre, no es por nada pero es que este problema es trivial. Lo que quiero decir es que la dificultad real del problema consiste justamente en que no todos los lenguajes tendrán enteros tan largos (o aunque los tengan, pues Delphi cuenta con los BCD), de manera que el problema está en ingeniárselas sin ellos, tal y como hizo seoane.

Hice el planteo del problema, porque estaba seguro que no habia un tipo de datos de delphi para hacerlo de manera simple, ahora que me cuentas del tipo BCD implementado en delphi, me entero de una novedad :D , igual a mi me parecio excelente la reinvension de rueda del amigo Seoane.

marceloalegre 17-11-2006 14:23:35

Implementacion BCD
 
Me quede pensando en el uso del BCD y implemente la funcion en delphi en base a la que tenia en java... mmm no anda... a ver si alguien me corrige en mi desconocimiento del uso de los TBCD...

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  last1,last2, aux:TBcd;
begin
  Last1:=StrToBcd('0');
  Last2:=StrToBcd('1');
  Aux  :=StrToBcd('0');
  while true do //jeje no queda agradable pero corto con el exit.. costumbre!
  begin
    BcdAdd(Last1,Last2,Aux); //sumo el f(x-1)+f(x-2) y lo meto en aux...
    Last1:= last2;
    Last2:=Aux;
    if Length(BcdToStr(Aux))= 21 then
    begin
      ShowMessage(BcdToStr(Aux));
      Exit;
    end;
  end;
end;

:) el ciclo no corta nunca, porque empieza haciendo bien las cuentas aparentemente y despues :confused: mm no se....

Saludos!

seoane 17-11-2006 14:34:05

;) Si es que no nos fijamos

Código Delphi [-]
var
  last1,last2, aux:TBcd;
begin
  Last1:=StrToBcd('0');
  Last2:=StrToBcd('1');
  Aux  :=StrToBcd('0');
  while true do //jeje no queda agradable pero corto con el exit.. costumbre!
  begin
    BcdAdd(Last1,Last2,Aux); //sumo el f(x-1)+f(x-2) y lo meto en aux...
    Last1:= last2;
    Last2:=Aux;
    if Length(BcdToStr(Aux))= 21 then
    begin
      ShowMessage(BcdToStr(Last1));  // <--- Fijate bien
      Exit;
    end;
  end;
end;

marceloalegre 17-11-2006 15:10:19

Es muy correcto lo que me dices Domingo!, de esta manera muestro el mayor de 20 digitos. Mas alla de esto noto que al ejecutar este codigo el ciclo nunca termina, evidentemente no se forma nunca una cadena de 21 caracteres, por causas desconocidas :rolleyes: ...

roman 17-11-2006 16:30:30

Bueno, al parecer el ciclo nunca termina porque al inicializar Last1 y Last2 de esa manera, ambos quedan con una precisión de 1 que no alcanza ni para un entero de tres dígitos.

Lo he podido hacer así:

Código Delphi [-]
var
  s,t,u: TBcd;

begin
  // Aquí inicializamos a 1 pero con precisión 21
  NormalizeBcd(IntegerToBcd(1), s, 21, 0);
  NormalizeBcd(IntegerToBcd(1), t, 21, 0);

  BcdAdd(s, t, u);

  while Length(BcdToStr(u)) <= 20 do
  begin
    s := t;
    t := u;

    BcdAdd(s, t, u);
  end;

  Edit1.Text := BcdToStr(t);
end;

// Saludos

seoane 17-11-2006 16:33:11

Cita:

Empezado por roman
Bueno, al parecer el ciclo nunca termina porque al inicializar Last1 y Last2 de esa manera, ambos quedan con una precisión de 1 que no alcanza ni para un entero de tres dígitos.

:confused: No estoy familiarizado con estos números, pero en mi turbo el método de kanvictor me funcionaba hasta con 60 dígitos. ¿Puede que se inicialicen de diferente manera?

marceloalegre 17-11-2006 16:50:48

Cita:

Empezado por seoane
:confused: No estoy familiarizado con estos números, pero en mi turbo el método de kanvictor me funcionaba hasta con 60 dígitos. ¿Puede que se inicialicen de diferente manera?

Epa! entonces estamos descubriendo que en turbodelphi hay cosas de esta indole implementadas de manera distinta a versiones anteriores como en mi caso delphi 7 :eek: .-

roman 17-11-2006 17:09:57

Cita:

Empezado por kanvictor
en turbodelphi hay cosas de esta indole implementadas de manera distinta a versiones anteriores

Con razón no entendía yo. Primero mencionaste

Cita:

Empezado por kanvictor
el ciclo no corta nunca, porque empieza haciendo bien las cuentas aparentemente y despues mm no se....

y seoane tranquilamente te señaló el otro error, él no sabía del primero porque en turbo no se dá.

Lo que me desconcertó fue que tú le respondiste

Cita:

Empezado por kanvictor
Es muy correcto lo que me dices Domingo!

Porque entonces pensé que sólo a mi se me presentaba ese error.

:)

// Saludos


La franja horaria es GMT +2. Ahora son las 18:41:19.

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