Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (http://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Suma de números pares que hay entre dos números (http://www.clubdelphi.com/foros/showthread.php?t=91768)

Daniel2622 21-04-2017 05:15:55

Suma de números pares que hay entre dos números
 
Hola necesito ayuda con el siguiente ejercicio:
Escribe un programa que calcule la suma de los números pares que hay entre dos números dados como entrada. Usa la instrucción de ciclo while-do o repeat-until.
De antemano muchas gracias.
Saludos.

AgustinOrtu 21-04-2017 05:18:25

Y cual es tu duda?

Daniel2622 21-04-2017 05:21:57

[AgustinOrtu], es que no se como empezar el ejercicio.

ElKurgan 21-04-2017 09:05:19

A lo mejor te sirve esto:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  n1,n2,c,codigo:Integer;
  i: Integer;
  desde, hasta: integer;
  suma: Integer;
begin
  Memo1.Lines.Clear;
  val(Edit1.Text,n1,codigo);
  val(Edit2.Text,n2,codigo);
  if n1 < n2 then
  begin
    desde := n1;
    hasta := n2;
  end
  else
  begin
    desde := n2;
    hasta := n1;
  end;

  Memo1.Lines.Add(
    Format('Numeros Pares entre %0:d y %1:d', [desde, hasta]));

  i := desde;
  Suma := 0;
  repeat
    if (i mod 2) = 0 then
    begin
      Memo1.Lines.Add(Format('%d', [i]));
      Suma := Suma + i;
    end;
    i := i + 1;
  until i > hasta;
  Memo1.Lines.Add('--------------------');
  Memo1.Lines.Add(format('Total suma: %d', [Suma]));
end;
Un saludo

Daniel2622 21-04-2017 12:21:23

HolaElKurgan, tengo uma duda, que signsignifica lo siguiente:
Código Delphi [-]
Memo1.Lines.Add(
    Format('Numeros Pares entre %0:d y %1:d', [desde, hasta]));

  i := desde;
  Suma := 0;
  repeat
    if (i mod 2) = 0 then
    begin
      Memo1.Lines.Add(Format('%d', [i]));
      Suma := Suma + i;
    end;
    i := i + 1;
  until i > hasta;
  Memo1.Lines.Add('--------------------');
  Memo1.Lines.Add(format('Total suma: %d', [Suma]));
end;

Principalmente lo de los %.
Gracias y saludos.

ecfisa 21-04-2017 12:41:53

Hola.
Cita:

Empezado por Daniel2622 (Mensaje 515733)
HolaElKurgan, tengo uma duda, que signsignifica lo siguiente:
...
Principalmente lo de los %.
.

[ Format command ]

Saludos :)

roman 21-04-2017 22:00:29

Prueba éste:

Código Delphi [-]
function SumaPares(N, M: Integer): Integer;
begin
  while Random(2) = 0 do;

  if (N mod 2 = 1) then Inc(N);
  if (M mod 2 = 1) then Dec(M);

  Result := Round(((Sqr(M + 1) - 1) - (Sqr(N - 1) - 1))/4);
end;

:D

LineComment Saludos

Daniel2622 22-04-2017 02:14:02

Gracias [El Kurgan], me fue de gran ayuda tu código.
Saludos.

escafandra 23-04-2017 22:31:00

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.

roman 24-04-2017 15:11:21

Cita:

Empezado por escafandra (Mensaje 515829)
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;

:D

LineComment Saludos

roman 24-04-2017 15:23:59

Cita:

Empezado por escafandra (Mensaje 515829)
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

roman 24-04-2017 18:55:34

Rizando el rizo :rolleyes:

escafandra, creo que tu fórmula:

Cita:

Empezado por escafandra (Mensaje 515829)
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

escafandra 24-04-2017 23:57:02

Cita:

Empezado por roman (Mensaje 515883)
Rizando el rizo :rolleyes:

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 :D

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.

AgustinOrtu 25-04-2017 01:52:55

Estos matematicos locos...:D:D

roman 25-04-2017 02:18:07

Estupendo,

Cita:

Empezado por escafandra (Mensaje 515914)
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;

:D :D

LineComment Saludos

Neftali [Germán.Estévez] 25-04-2017 16:17:23

Cita:

Empezado por ElKurgan (Mensaje 515718)
A lo mejor te sirve esto:

Es posible que sea una opción fácil (sobre todo para la persona que está pidiendo ayuda con los deberes -o al menos esa sensación de da a mi-), pero tal vez deberíamos plantearnos si esta es la solución "adecuada" para un caso como este.

En los últimos días están saliendo varios hilos como este, y creo que tenemos que tener cuidado con las soluciones que ofrecemos.

No se si me explico claramente.

NOTA: No se trata de NO ayudar, en este caso a Daniel2622, ya que al final la utilidad del foro es esa, pero tampoco estamos para "hacerle los deberes a nadie".

AgustinOrtu 25-04-2017 21:57:02

Cita:

Empezado por Neftali (Mensaje 515946)
NOTA: No se trata de NO ayudar, en este caso a Daniel2622, ya que al final la utilidad del foro es esa, pero tampoco estamos para "hacerle los deberes a nadie".

Totalmente de acuerdo. De hecho no estamos ayudando, estamos haciendo mal a la persona. Por eso mi pregunta en estos casos es siempre la misma:

Cita:

Empezado por AgustinOrtu
Y cual es tu duda?


escafandra 26-04-2017 01:58:49

En realidad el hilo se ha derivado hacia disquisiciones y trucos matemáticos que nada tienen que ver con la propuesta del ejercicio, que claramente no pretendía la deriva ofrecida. De forma que hemos pasado un buen rato. :)

Saludos.

roman 26-04-2017 03:27:02

Coincido. Pequeño reto:

Hallar la fórmula ahora para la suma de impares entre dos números dados :)

LineComment Saludos

Neftali [Germán.Estévez] 26-04-2017 08:51:33

Cita:

Empezado por AgustinOrtu (Mensaje 515975)
Totalmente de acuerdo. De hecho no estamos ayudando, estamos haciendo mal a la persona. Por eso mi pregunta en estos casos es siempre la misma:

+1
Totalmente de acuerdo.


La franja horaria es GMT +2. Ahora son las 10:37:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi