Estoy aprendiendo python y he echo un script sencillo para calcular los números amigos (pareja de números la suma de los divisores propios de uno es igual al otro numero). Se que estos números tienen una formula para calcularlos pero lo he hecho manual para aprender bucles, ... Bueno no me lio el scrit hace tres cosas:
- 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()