Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #18  
Antiguo 20-09-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bueno, alguien que crea un programa para no tener que resolver los sudokus a mano , no podía contentarse con el algoritmo anterior.

Así que considerando que que 1000, incluso 10000, nos cabe dentro de una variable de tipo integer, podemos optimizar "un poco" el algoritmo de multiplicación.
Código Delphi [-]
program Fast;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

const
  Lon = 2600;
type
  TSuperLargo = array[0..Lon] of Byte;

function MulSuper(A: TSuperLargo; B: Integer): TSuperLargo;
var
  i,j: integer;
  Ac, Desp, Dig: Integer;
begin
  Desp:= 0;
  FillChar(Result,Sizeof(Result),#0);
  while B > 0 do
  begin
    Dig:= B mod 10;
    B:= B div 10;
    Ac:= 0;
    for i:= 0 to Lon - Desp do
    begin
      j:= Integer(Result[i+Desp]) + (Integer(A[i]) * dig) + Ac;
      Result[i+Desp]:= j mod 10;
      Ac:= j div 10;
    end;
    inc(Desp);
  end;
end;

function SuperToStr(a: TSuperLargo): string;
var
  i: integer;
  flag: Boolean;
begin
  Result:= '';
  flag:= FALSE;
  for i := Lon 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;

function Factorial(i: integer): String;
var
  j: Integer;
  A: TSuperLargo;
begin
  FillChar(A,Sizeof(A),#0);
  A[0]:= 1;
  for j:= 2 to i do
  begin
    A:= MulSuper(A,j);
  end;
  Result:= SuperToStr(a);
end;

var
  Cont1, Cont2: int64;
  Frec: int64;
begin
  Writeln('Calculando el factorial de 1000 ...');
  Writeln;
  QueryPerformanceFrequency(Frec);
  QueryPerformanceCounter(Cont1);
  Writeln(Factorial(1000));
  QueryPerformanceCounter(Cont2);
  Writeln;
  Writeln;
  Writeln(Format('Se emplearon %d milisegundos',[((Cont2-Cont1) * 1000) div Frec]));
end.

La nueva marca es de tan solo 589 milisegundos

Que a gusto me he quedado

Edito:
El factorial de 10,000 (35,659 cifras) tarda 67,202 milisegundos, poco mas de un minuto.

Si alguien tiene curiosidad de saber cual es que se baje el adjunto
Archivos Adjuntos
Tipo de Archivo: zip 10000.zip (16,0 KB, 22 visitas)

Última edición por seoane fecha: 20-09-2007 a las 16:15:31.
Responder Con Cita
 



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
ArdiIIa con 1000 Caral La Taberna 23 19-09-2007 00:36:25
Ahora Si 1000.... ArdiIIa La Taberna 21 02-08-2007 09:12:23
Al fin llego a los 1000! D-MO La Taberna 9 01-08-2007 20:41:20
Facturas B >$1000 en Hasar 320 pborges36 Impresión 2 24-01-2007 15:44:39
TDBGrid con más de 1000 registros daly Conexión con bases de datos 2 31-10-2005 14:33:13


La franja horaria es GMT +2. Ahora son las 09:52:28.


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