PDA

Ver la Versión Completa : Suma de números pares que hay entre dos números


Daniel2622
21-04-2017, 05:15:55
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:


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:
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.
HolaElKurgan, tengo uma duda, que signsignifica lo siguiente:
...
Principalmente lo de los %.
.
[ Format command (http://www.delphibasics.co.uk/RTL.asp?Name=format) ]

Saludos :)

roman
21-04-2017, 22:00:29
Prueba éste:


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:

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
Esta opción requiere menor potencia de cálculo:

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:


while Random(2) = 0 do;


:D

LineComment Saludos

roman
24-04-2017, 15:23:59
Esta opción requiere menor potencia de cálculo:

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:


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



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:


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

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


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,



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:


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


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
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.

escafandra
26-04-2017, 22:13:07
Coincido. Pequeño reto:

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

LineComment Saludos


function SumaImPares(n, m: Integer): Integer;
begin
dec(n, n and 1);
inc(m, m and 1);
Result:= MulDiv(m-n, n+m, 4);
end;

:D

Saludos.

roman
26-04-2017, 22:47:29
¡Anda! ¡Estupendo!

LineComment Saludos