Programa para hallar números amigos

Iniciado por Charderak, 25 Junio 2010, 19:50 PM

0 Miembros y 2 Visitantes están viendo este tema.

Charderak

Hola, tengo un problemilla haciendo este programa, tengo ya el código y no me da problemas al compilar, pero a la hora de ejecutarlo no hace nada, y no sé dónde puede estar el fallo. Os dejo el enunciado de la práctica para que entendáis qué estoy haciendo y el código, muchas gracias!

Enunciado:

Dos números a y b se dicen que son amigos si la suma de los divisores de a (salvo él mismo)
coincide con b y viceversa.
El menor par de números amigos es el formado por el 220 y el 284, ya que:
Suma de divisores de 220 (excepto 220): 1+2+4+5+10+11+20+22+44+55+110=284.
Suma de divisores de 284 (excepto 284): 1+2+4+71+142=220.
Otros números amigos son 2620 y 2924, 6232 y 6368, 17296 y 18416, 9363584 y 9437056.
Escribe un programa que tenga como entrada dos números naturales n y m y muestre en
pantalla todas las parejas de números naturales que existan en el intervalo [n, m].

Código:

   
Código (fortran) [Seleccionar]
PROGRAM PRACTICA4
INTEGER a, b, i, j, n, m, s, t
PRINT *, 'Introduzca el número n (el menor)'
READ *, n
PRINT *, 'Introduzca el número m (el mayor)'
READ *, m
DO WHILE (n<m)
DO i=1, n/2
a=MOD(n,i)
IF (a==0) THEN
s=s+i
END IF
END DO
DO j=1, m/2
b=MOD(m,j)
IF (b==0) THEN
t=t+j
END IF
END DO
IF (s==t) THEN
PRINT *, n, ' y ', m, ' son amigos'
END IF
                n=n+1
END DO
END


Debci

Primero no has dicho ni que lenguaje es ni nada por ele stilo, segundo ni has enmarcado el codigo ni que sea con quotes.

Usa geshi que por algo esta, y me comprometo a ayudarte.

Saludos

Charderak

El lenguaje es Fortran, en cuanto a lo del "geshi" lo siento, pero no sé lo que es, lo he agrupado en colorines, en azul marino el ciclo DO WHILE principal, y en verde y negro los ciclos DO internos dentro del ciclo DO WHILE

Las instrucciones las he puesto en rojo

.:WindHack:.

Cita de: Charderak en 26 Junio 2010, 04:10 AM
El lenguaje es Fortran, en cuanto a lo del "geshi" lo siento, pero no sé lo que es, lo he agrupado en colorines, en azul marino el ciclo DO WHILE principal, y en verde y negro los ciclos DO internos dentro del ciclo DO WHILE

Las instrucciones las he puesto en rojo

Se refiere a usar las etiquetas de código:

[code=fortran]/* Aquí el código del programa... */[/code]

Follow me on Twitter: @windhack | Visit my website: www.daw-labs.com

"The only thing they can't take from us are our minds."

Charderak

Listo, muchas gracias y a ver si así se anima alguien a echarme una mano :P

cbug

La verdad no conozco fortran, Pero lo que veo que puede traer fallas es que a s y t no los inicializaste. Ahora bien, no te deja ni siquiera leer los datos desde stdin?

Charderak

No es eso, en Fortran no hace falta inicializar las variables. Lo de stdin la verdad es que no entiendo a qué te refieres, pero el programa arrancar arranca y me pide los valores de n y m, pero al introducirlos ya no hace nada más

cbug

En realidad ahora que lo miro con detenimiento:

DO WHILE (n<m)

En el rango del bucle, nunca modificas esos valores, no será más precisamente un

if(n<m)

:huh:

Charderak

Cita de: cbug en 27 Junio 2010, 04:59 AM
En realidad ahora que lo miro con detenimiento:

DO WHILE (n<m)

En el rango del bucle, nunca modificas esos valores, no será más precisamente un

if(n<m)

:huh:

Llevas razón, lo he corregido añadiendo un n=n+1 antes de cerrar el ciclo DO WHILE. Ahora sí "termina" de ejecutarse, pero no me aparece nada, sólo me pide los números y ya me sale lo de Press any key to continue, y estoy poniendo un intervalo donde sé seguro que hay al menos dos números "amigos", así que hay algo que está mal :(

cbug

#9
En realidad ahora que leo el problema, el bucle sería:

do(n <= m)

Ya que es un intervalo cerrado.

Ahora bien, en el rango del bucle, la lógica está bien. Depuralo.

Por otra parte te recomienda que al problema le falto algo, recuerda esto : "programa que muestre TODAS las parejas".