Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/02/2011, 06:35
neburel
 
Fecha de Ingreso: febrero-2011
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
Pregunta problema script sencillo

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
  1. #!/usr/bin/env python
  2.  
  3. import sys
  4. import time
  5. import os
  6.  
  7.  
  8. def grep_w(arch, busq):
  9.     """Realiza grep -w de busq (cadena) en arch (archivo) y devuelve si
  10.    lo encuentra"""
  11.     s_busq = str(busq)
  12.     return os.system("grep -w " + s_busq  + " " + arch)
  13.  
  14. def escribir_cont(arch, que):
  15.     """Escribe que (cadena) al final de arch (archivo)"""
  16.     with open(arch, "a") as fil:
  17.         fil.write(que)
  18.  
  19. def suma_div(num):
  20.     """Suma todos los divisores propios de num y devuelve el resultado"""
  21.     suma = 0
  22.     for part in range(1, num):
  23.         resto = num % part  #Es un tanto porciento
  24.         if resto == 0:
  25.             suma += part
  26.     return suma
  27.  
  28. def num_amigos():
  29.     """Realiza las operaciones para encontrar los numeros amigos y lo guarda en
  30.    numeros. Tambien crea num_control cada 100 comprobaciones y num_ya con los
  31.    numeros no comprobados que no podrian ser amigos"""
  32.     n_final = int(sys.argv[1]) #Recoge primer argumento
  33.     n_ini = int(sys.argv[2]) #Recoge segundo argumento
  34.     contador = 1
  35.     for i in range(n_ini, n_final):
  36.         if grep_w("num_ya", i) == 256: #Sino lo encuentra
  37.             sumadiv = suma_div(i) #Suma todos los divisores
  38.         pareja = sumadiv  #Tenemos el otro numero a comprobar
  39.         if i < pareja: #Si es menor porque sino ya se ha comprobado
  40.             if grep_w("num_ya", i) == 256: #Sino lo encuentra
  41.                 sumadiv = suma_div(pareja) #Suma todos los divisores
  42.                 comparar = sumadiv #Obtenemos lo que debería ser el primero (i)
  43.                 if i == comparar: # Si cumple son amigos
  44.                     escribir_cont("numeros", str(i) + " , " + str(pareja)) #Escribe en numeros la pareja
  45.                 elif i > comparar: #Si cumple pareja ya no puede ser y luego no se comprueba
  46.                     escribir_cont("num_ya", pareja) #Escribe pareja
  47.         intermedio = 100 * contador + n_ini #Para comprobar cuando pasan 100 comprobaciones
  48.         if i == intermedio: #Si cumple han pasado 100
  49.             contador += 1 #Aumenta el contador
  50.             hora = time.strftime("%H:%M:%S") #Hora actual
  51.             escribir_cont("num_control", str(intermedio) + " a la " + str(hora)) #Escribe numero actual y la hora
  52.     mens = n_final - 1
  53.     print "Se han verificado los numeros amigos hasta el " + str(mens) #Muestra que ha acabado
  54.  
  55.  
  56. num_amigos()

Última edición por neburel; 19/02/2011 a las 10:28