es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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 hasta numerator+1, y en cada iteración, el valor de numerator 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 de numerator 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 que denominator. Esto asegurará que el bucle se detenga tan pronto como el valor de numerator sea menor que denominator.

    Aquí está el código actualizado:

    numerator = 20
    denominator = 4
    
    if numerator >= denominator:
        results=[]
        while numerator >= denominator:
            numerator = numerator - denominator
            results.append(numerator)
        print(results)
        # filter_negative = [i for i in results 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')
    

    Esto dará la salida deseada [16, 12, 8, 4, 0].

Comments are closed.