2012-05-26 24 views
7

Estoy tratando de encontrar el mayor factor común.Python While Loop, el operador y (&) no funciona

Escribí un algoritmo malo (operación intensiva) que reduce el valor inferior en uno, comprueba con% para ver si divide el numerador y el denominador, si lo hace, entonces sale del programa. Sin embargo, mi ciclo while no utiliza el operador y, por lo tanto, una vez que el numerador es divisible se detiene, aunque no es la respuesta correcta.

Los números que estoy usando son 54 y 42, la correcta GCD (máximo común denominador) es 6.

#heres a simple algorithm to find the greatest common denominator: 

iterations = 0; #used to calculate number of times while loop is executed 

u = 54; v= 42; d = v-1; #u is the numerator, v is the denominator, d is the number decremented by one 

while ((v % d !=0) & (u % d != 0)): #while both numerator AND denominator cannot be evenly divided by the decremented number 
d -= 1 #decrement the number by one 
print d #print the number decremented 
iterations +=1 #add 1 to the count of iterations in while loop 

print "the gcd is " +str(d) #should be 6 when the number can evenly divide both 
print "the number of iterations was " +str(iterations) #display times it took algorithm to complete 

La respuesta que estoy recibiendo es de 27, lo que me dice una vez que alcanza 27 y se puede dividir 54/27 uniformemente, se detiene. ¿Alguna idea sobre cómo usar un operador and en un ciclo while en python?

Gracias!

Respuesta

15

Usted debe estar utilizando la palabra clave and en lugar del operador AND &:

while (v % d != 0) and (u % d != 0): 

Ésta es también la misma:

while (v % d) and (u % d): 

Tenga en cuenta que & y and dará el mismo resultado en el primer caso, pero no en el segundo.

Su problema es que desea utilizar or en lugar de and. También tu algoritmo es altamente ineficiente. Hay better ways to calculate the GCD.

+0

Gracias por su contribución, traté de usar la palabra clave y, aunque todavía tengo 27, ¿está obteniendo el mismo resultado? – Blakedallen

+0

@Blakedallen: prueba con 'o'. –

+0

¡Tiene razón, esto es altamente ineficiente! Creo que el algoritmo de Euclides es mucho mejor. – Blakedallen

0

Utilice la palabra clave and. & es un operador bit a bit.