Python - Números amigos.

 
Vista:
sin imagen de perfil

Números amigos.

Publicado por sor (12 intervenciones) el 04/04/2017 21:12:39
Se trata, dadas dos listas, de emparejar los números amigos. Es decir, algo así como:
lista=[220,10,1184,5,6232,12]
lista1=[284,13,1210,7,6368,1]
resultado=[220,284,1184,1210,6232,6368], o bien:
resultado=[[220,284],[1184,1210],[6232,6368]], o bien:
[(220,284),(1184,1210),(6232,6368)]

Mi intento:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def amigos(lista,lista1):
    l=[]
    suma=0
    for i in lista:
        for j in range(1,i):
            for k in lista1:
                if i%j==0:
                    suma+=k
                    l.append(i)
                    l.append(k)
    return l
 
lista=[220,10,1184,5,6232,12]
lista1=[284,13,1210,7,6368,1]
 
print(amigos(lista,lista1))

¿Se os ocurre algo?,¿qué hago mal?. Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Números amigos.

Publicado por kip (257 intervenciones) el 05/04/2017 05:47:44
Hola, aun no entiendo exactamente cuales son las reglas que hay que seguir para que los numeros sean amigos, pero viendo los ejemplos de resultados asumi que estos se basan en la unidad del numero mayor de ambos, sea este numero una centena, dos centenas, unidad de mil, dos unidades de mil..... y que el menor este en el rango de la primera unidad de este y el numer mayor, por ejemplo:

120 y 140
Unidad 100
Rango 100, 101, 102... 140
Menor 120
120 debe estar entre 100 y 140.

120 y 240
Unidad 200
Rango 200, 201, 202... 240
Menor 120
120 debe estar entre 200 y 240.

120 y 140 SI SON AMIGOS!
120 y 240 NO SON AMIGOS!


Siguiendo aquella logica y considerando solo los numeros mayores a 99 (siguiendo tu ejemplo de resultados) el codigo que he hecho es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def amigos(l1, l2):
    lamigos = []
    for i in sorted(l1):
        list_temp = [] #Lista temporal
        for j in sorted(l2):
            maxn = max(i, j) #Numero mayor
            minn = min(i, j) #Numero menor
            #Obtengo la unidad del numero mayor
            un = int(str(maxn)[0] + (len(str(maxn)) - 1) * '0')
            #Verifico que el numero menor este en el rango
            #Tambien que el numero mayor sea mayor a 99
            if (minn in list(range(un, maxn)) and maxn > 99):
                #Almaceno en la lista temporal este numero de l2
                #que entra en el rango
                list_temp.append(j)
        #Si existio algun numero en la lista temporal
        if (len(list_temp) > 0):
            #Agrego en la lista a retornar
            #la union entre el numero de l1 y la lista temporal
            lamigos.append([i] + list_temp)
    return lamigos

La pruebo:

1
2
3
4
lista=[220, 10, 1184, 5, 6232, 12, 100]
lista1=[284, 13, 1210, 7, 6368, 1, 6459]
 
print(amigos(lista,lista1))

Resultado que muestra:

1
[[220, 284], [1184, 1210], [6232, 6368]]

No se si es lo que buscas, de otra forma podrias detallarnos mas el tipo de regla a implementar o algo que sea mas especifico.

Pruebalo y nos cuentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Números amigos.

Publicado por sor (12 intervenciones) el 03/05/2017 05:05:15
Hola kip. El código funciona, pero no sé si es exactamente lo que dices, por el tema de los números amigos. Copio de la wikipedia: "Dos números amigos son dos números enteros positivos a y b tales que la suma de los divisores propios de uno es igual al otro número y viceversa, es decir σ(a)=b y σ(b)=a, donde σ(n) es igual a la suma de los divisores de n, sin incluir a n. (La unidad se considera divisor propio, pero no lo es el mismo número.).

Un ejemplo es el par de naturales (220, 284), ya que:

los divisores propios de 220 son 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 y 110, que suman 284;
los divisores propios de 284 son 1, 2, 4, 71 y 142, que suman 220.

Si un número es amigo de sí mismo (es igual a la suma de sus divisores propios), recibe entonces el nombre de número perfecto."

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar