Ver Mensaje Individual
  #13  
Antiguo 25-04-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Reputación: 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 01:00:50.
Responder Con Cita