- Mira si el número esta en num_ya y sino calcula números amigos entre los dos que lo damos y los escribe en numeros (lo hace bien)
- Para controlar el tiempo que tarda y en caso de error, ... saber por donde va aunque sea mas o menos, cada 100 números revisados escribe el número revisado en ese momento y la hora en num_control (lo hace bien)
- Cuando calcula suma de divisores de un posible miembro de números amigos y el resultado es imposible que de la otra parte de la pareja lo escribe en num_ya para evitar calculos inútiles más adelante (lo hace bien)
Todo lo que quería lo hace bien pero me lanza al final por pantalla los números que ha encontrado para escribir en num_ya pero además ordenados no como los ha escrito. No se porque hace esto me gustaría que no lo mostrara. Creía que era por no poner un return a la función pero he probado y también lo hace. No hay nada en el código que le diga que me muestre por pantalla excepto el print y menos que se guarde nada en memoria y luego lo ordene (que yo sepa).
ejemplo: ./numeros_amigos.py 221 4 (empieza a calcular en 4 hasta 220)
Código Python:
Ver original
#!/usr/bin/env python import sys import time import os def grep_w(arch, busq): """Realiza grep -w de busq (cadena) en arch (archivo) y devuelve si lo encuentra""" s_busq = str(busq) return os.system("grep -w " + s_busq + " " + arch) def escribir_cont(arch, que): """Escribe que (cadena) al final de arch (archivo)""" with open(arch, "a") as fil: fil.write(que) def suma_div(num): """Suma todos los divisores propios de num y devuelve el resultado""" suma = 0 for part in range(1, num): resto = num % part #Es un tanto porciento if resto == 0: suma += part return suma def num_amigos(): """Realiza las operaciones para encontrar los numeros amigos y lo guarda en numeros. Tambien crea num_control cada 100 comprobaciones y num_ya con los numeros no comprobados que no podrian ser amigos""" n_final = int(sys.argv[1]) #Recoge primer argumento n_ini = int(sys.argv[2]) #Recoge segundo argumento contador = 1 for i in range(n_ini, n_final): if grep_w("num_ya", i) == 256: #Sino lo encuentra sumadiv = suma_div(i) #Suma todos los divisores pareja = sumadiv #Tenemos el otro numero a comprobar if i < pareja: #Si es menor porque sino ya se ha comprobado if grep_w("num_ya", i) == 256: #Sino lo encuentra sumadiv = suma_div(pareja) #Suma todos los divisores comparar = sumadiv #Obtenemos lo que debería ser el primero (i) if i == comparar: # Si cumple son amigos escribir_cont("numeros", str(i) + " , " + str(pareja)) #Escribe en numeros la pareja elif i > comparar: #Si cumple pareja ya no puede ser y luego no se comprueba escribir_cont("num_ya", pareja) #Escribe pareja intermedio = 100 * contador + n_ini #Para comprobar cuando pasan 100 comprobaciones if i == intermedio: #Si cumple han pasado 100 contador += 1 #Aumenta el contador hora = time.strftime("%H:%M:%S") #Hora actual escribir_cont("num_control", str(intermedio) + " a la " + str(hora)) #Escribe numero actual y la hora mens = n_final - 1 print "Se han verificado los numeros amigos hasta el " + str(mens) #Muestra que ha acabado num_amigos()