Implementar la división como una serie de sustracciones – Python.
Estoy tratando de implementar una división como una serie de restas. Por ejemplo: 10/2 => 10-2-2-2-2-2=0, 10 menos 2 cinco veces, con un resto de 0.
He hecho esto con un bucle “while” que parece apropiado para la tarea. Sin embargo, también intenté implementarlo con un bucle “for”. A continuación se muestra mi bucle “while”.
# Intentando con un bucle while
numerador = 20
denominador = 4
resultados = []
while numerador >= denominador:
numerador = int(numerador) - int(denominador)
resto = numerador
resultados.append(resto)
print('El resto es:', resto)
print(resultados)
else:
print('El numerador debe ser mayor que el denominador') # si el numerador es menor que el denominador
Estoy experimentando algunos problemas con mi bucle “for”. Tuve que usar una comprensión de lista para descartar cualquier número negativo dentro de range(denominador, numerador+1)
(usando +1 para que pueda tomar el valor completo del numerador). Parece que la operación numerador = int(numerador) - int(denominador)
sigue yendo a los números negativos. Si imprimes lo siguiente, obtendrás [16, 12, 8, 4, 0, -4, -8, -12, -16, -20, -24, -28, -32, -36, -40, -44, -48]
. Si descomentas la comprensión de la lista, obtendrás [16, 12, 8, 4, 0]
(que es lo que quiero). Me gustaría entender por qué este rango sigue yendo a los números negativos.
numerador = 20
denominador = 4
if numerador >= denominador:
resultados=[]
for i in range(denominador, numerador+1):
numerador = int(numerador) - int(denominador)
resultados.append(numerador)
print(resultados)
# filter_negative = [i for i in resultados if i >=0]
# print('Los resultados son:', filter_negative)
# print('El resto es:', filter_negative[-1] )
else:
print('El numerador debe ser mayor que el denominador')
¡Gracias a todos!
davy.ai
Solución
El problema con la implementación del bucle for es que la función range genera una secuencia de números desde
denominator
hastanumerator+1
, y en cada iteración, el valor denumerator
se actualiza sin importar si es una resta válida o no. Esto significa que el bucle for siempre iteraránumerator
veces, incluso si el valor denumerator
se vuelve negativo en algún punto.Para solucionar esto, podemos usar un bucle while en lugar de un bucle for, y actualizar el valor de
numerator
solo si es mayor o igual quedenominator
. Esto asegurará que el bucle se detenga tan pronto como el valor denumerator
sea menor quedenominator
.Aquí está el código actualizado:
Esto dará la salida deseada
[16, 12, 8, 4, 0]
.