Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Esta opción requiere menor potencia de cálculo:
Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);
  Result:= ((m - n) div 2 + (m - n) mod 2) * ((n + m) div 2);
end;

Saludos.
Responder Con Cita
  #2  
Antiguo 24-04-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por escafandra Ver Mensaje
Esta opción requiere menor potencia de cálculo:
Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);
  Result:= ((m - n) div 2 + (m - n) mod 2) * ((n + m) div 2);
end;

Saludos.
Je, je, sí, pero es que el ejercicio pedía el uso de while-do o repeat-until. De ahí la línea que habia puesto:

Código Delphi [-]
while Random(2) = 0 do;



LineComment Saludos
Responder Con Cita
  #3  
Antiguo 24-04-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por escafandra Ver Mensaje
Esta opción requiere menor potencia de cálculo:
Código Delphi [-]
Result:= ((m - n) div 2 + (m - n) mod 2) * ((n + m) div 2);
Por cierto, que está muy bonita esta fórmula. Originalmente la que había obtenido yo era ésta:

Código Delphi [-]
(m - n + 2)*(m + n)/4;

y al tratar de hacerla más simétrica fue que obtuve los cuadrados. Pero la tuya los evita y queda mejor

LineComment Saludos
Responder Con Cita
  #4  
Antiguo 24-04-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Rizando el rizo

escafandra, creo que tu fórmula:

Cita:
Empezado por escafandra Ver Mensaje
Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);

  Result:= ((m - n) div 2 + (m - n) mod 2) * ((n + m) div 2);
end;
puede aún ser más sencilla. Debido a los dos condicionales, n y m siempre son impares y por tanto (n + m) y (n - m) siempre son pares. Entonces (m - n) mod 2 siempre es cero y se reduce a ((m - n) div 2) * ((n + m) div 2) y como los términos son pares el div coincide con la división normal, así que podemos ponerlo como

(m - n)*(m + n)/4 = (m - n)*(m + n) div 4

o sea:

Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);

  Result := (m - n)*(m + n) div 4;
end;

LineComment Saludos
Responder Con Cita
  #5  
Antiguo 24-04-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Rizando el rizo

escafandra, creo que tu fórmula:



puede aún ser más sencilla. Debido a los dos condicionales, n y m siempre son impares y por tanto (n + m) y (n - m) siempre son pares. Entonces (m - n) mod 2 siempre es cero y se reduce a ((m - n) div 2) * ((n + m) div 2) y como los términos son pares el div coincide con la división normal, así que podemos ponerlo como

(m - n)*(m + n)/4 = (m - n)*(m + n) div 4

o sea:
Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);

  Result := (m - n)*(m + n) div 4;
end;

LineComment Saludos
Efectivamente roman sale una fórmula bastante redonda y sabiendo que suma por diferencia es diferencia de cuadrados, no lo aplicaremos para no desbordar rápidamente los enteros (en caso de límites más amplios). Ya puestos y con ese fin, usamos la API de Windows

Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);
  Result:= MulDiv(m-n, n+m, 4);
end;

Saludos.

Última edición por escafandra fecha: 25-04-2017 a las 00:00:50.
Responder Con Cita
  #6  
Antiguo 25-04-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Estos matematicos locos...
Responder Con Cita
  #7  
Antiguo 25-04-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Estupendo,

Cita:
Empezado por escafandra Ver Mensaje
Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);
  Result:= MulDiv(m-n, n+m, 4);
end;
Ya nada más para satisfacer al maestro:

Código Delphi [-]
function SumaPares(n, m: Integer): Integer;
begin
  while false do;

  if(n mod 2 = 0) then dec(n);
  if(m mod 2 = 0) then inc(m);
  Result:= MulDiv(m-n, n+m, 4);
end;



LineComment Saludos
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
Números aleatorios decimales entre 0 y 1 LuisAlf:: Varios 2 30-04-2011 00:59:56
Comparar 2 numeros jzginez OOP 6 18-02-2010 01:41:11
Numeros a letras citlalliDgp Varios 6 19-03-2009 07:14:54
Los numeros del Pasaporte / DNI seoane Trucos 0 08-06-2006 13:31:59
equivalencia entre tipos de numeros kikodelphi MS SQL Server 4 14-12-2005 11:59:55


La franja horaria es GMT +2. Ahora son las 05:16:11.


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