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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.