Суммировать множители числа (исключая само число)

#python

#python

Вопрос:

После того, как я отредактировал свой код, я понял, как это сделать:

 def sum_factors(n):
  sum = 0
  factor = 1
  # Return the sum of all factors of n, not including n
  while n!=0 and factor < n:
    if n % factor == 0:
        sum = sum   factor
        factor = factor   1
    else:
        factor = factor   1
  return sum
 

Мой первоначальный код не мог суммировать множители, но я не понимаю, почему:

 def sum_divisors(n):
  sum = 0
  factor = 1
  # Return the sum of all divisors of n, not including n
  while n % factor == 0 and factor < n:
    sum = sum   factor
    factor = factor   1
  return sum
 

Не могли бы вы объяснить, почему мой первоначальный код не работал?

Комментарии:

1. while Цикл завершится в первый раз n % factor , если он не равен нулю.

Ответ №1:

Ваш цикл while записывает

 while n % factor == 0 and factor < n:
 

Это будет означать, что как только условие проверки коэффициента n% будет ложным, код выйдет из цикла while.

Давайте используем 10 в качестве примера.

10 % 1 равно нулю, а 10 % 2 равно 0. Но 10 % 3 не равно 0. Это означает, что мы выходим из цикла while, как только коэффициент достигает 3.

Тогда ответ, который мы получим, будет суммой 1 и 2, что было бы неверно.

Ответ №2:

В исходном коде особое внимание уделяется условию while n % factor == 0 , которое не является необходимым условием для завершения цикла while.

Ответ №3:

Иногда это помогает добавить некоторые выходные данные отладки в программу Python:

 def sum_divisors(n):
    sum = 0
    factor = 1
    # Return the sum of all divisors of n, not including n
    print(f"factor = {factor}")
    while n % factor == 0 and factor < n:
        sum = sum   factor
        factor = factor   1
        print(f"factor = {factor}")
    return sum

print(sum_divisors(30))
 

Вывод

 factor = 1
factor = 2
factor = 3
factor = 4
6
 

Примечания

Как мы можем видеть, цикл while завершается, когда он находит число, которое не является фактором.

Рефакторинг

Я заметил, что у вас есть дублирующийся код в вашем if-else блоке. Всякий раз, когда это происходит, вы можете переместить общий код за пределы:

     if n % factor == 0:
        sum = sum   factor
    factor = factor   1