Tengo una lista NumList = [2,4] y un número entero ex. 16. Quiero encontrar todos los elementos en range(1,16) que son divisibles por 2 y 4 en NumList.

Probé el código y busqué en Internet, pero no pude obtener resultados satisfactorios. Amablemente ayuda. Por favor no critique si es básico. Soy nuevo en programación y no estoy muy familiarizado con estos fundamentos.

Código:-

fact = list()

for i in range(1,16):
    for x in a:
        num = i % x
        if num == 0:
            fact.append(i)

print(fact)

Salida: - [2, 4, 4, 6, 8, 8, 10, 12, 12, 14]. ¿Dónde me equivoco?

-3
Ankit 9 may. 2019 a las 21:03

4 respuestas

La mejor respuesta

Utilice la función all de la biblioteca estándar y {{ X0}} operador:

El operador% (módulo) produce el resto de la división del primer argumento por el segundo. Los argumentos numéricos se convierten primero a un tipo común. Un argumento de cero a la derecha genera la excepción ZeroDivisionError. Los argumentos pueden ser números de coma flotante, por ejemplo, 3.14% 0.7 es igual a 0.34 (ya que 3.14 es igual a 4 * 0.7 + 0.34.) El operador de módulo siempre produce un resultado con el mismo signo que su segundo operando (o cero); El valor absoluto del resultado es estrictamente menor que el valor absoluto del segundo operando

l = [3, 4, 5]

for num in range(1, 250):
    if all(num % x == 0 for x in l):
        print(num)

Imprimirá:

60
120
180
240
2
Brad Solomon 9 may. 2019 a las 18:22

Puedes hacerlo usando loop

l=16

numlist=[2,5]
divlist=[]

for i in range(1,l):
    a=0
    for item in numlist:
        if(i%item==0):
            a +=1
            if(a==len(numlist)):
                divlist.append(i)                

print(divlist)
0
Zaynul Abadin Tuhin 9 may. 2019 a las 18:23

Para obtener la lista, puede probar si la suma del módulo de cada elemento es cero:

n = [2, 4]
r = range(1,16) 
[num for num in r if not sum([num % j for j in n])]

# [4, 8, 12]
0
Mark Meyer 9 may. 2019 a las 18:13

Los números que son divisibles por todos los valores en NumList serán múltiplos del MCM de estos valores (mínimo común múltiplo). El módulo matemático proporciona una función gcd () que se puede usar para calcular el MCM de dos números LCM(a,b) = a*b/gcd(a,b).

Entonces, si primero calcula el MCM de todos los números en NumList, puede usar un rango de pasos para obtener directamente los múltiplos que está buscando:

numList = [2,4]
maxNum  = 16

from math import gcd
LCM       = 1
for n in numList: LCM = LCM*n//gcd(LCM,n)
multiples = list(range(LCM,maxNum+1,LCM))

print(multiples) # [4, 8, 12, 16]

Tenga en cuenta que esto se ejecutará mucho más rápido que las técnicas de módulo cuando los números en numList son grandes:

Por ejemplo:

numList = [295243, 2975141]
maxNum  = 270737831

El enfoque de múltiplos de LCM produce el resultado instantáneamente (a diferencia de los bucles de módulo que tomarían mucho tiempo)

# [38676833, 77353666, 116030499, 154707332, 193384165, 232060998, 270737831]

Si no desea usar el módulo matemático, puede escribir sus propias funciones gcd() y lcm() y usarlas así:

def gcd(a,b):    return b if a == 0 else gcd(b%a,a)
def lcm(a,b,*c): return a*b//gcd(a,b) if not c else lcm(lcm(a,b),*c)

numList   = [2,3,5,7,11,13,17,19]
maxNum    = 70000000    
LCM       = lcm(*numList)
multiples = list(range(LCM,maxNum+1,LCM))

# [9699690, 19399380, 29099070, 38798760, 48498450, 58198140, 67897830]

Tenga en cuenta que la recursividad en lcm () elimina los bucles for y solo se aplica a los valores en numList. El rendimiento general será proporcional al número de factores en numList en lugar de un múltiplo de maxNum.

1
Alain T. 10 may. 2019 a las 18:14