Проблемы с циклом "пока" - PullRequest
1 голос
/ 05 февраля 2020

Мне нужно как-то выполнить функцию, в которой при выполнении я смогу добавить все делители числа, как показано ниже.

Это сводит меня с ума, я был в той же проблеме в течение часа.

def sum_divisors(n):
  # Return the sum of all divisors of n, not including n
  divisor = 1
  while divisor < n:
    if n%divisor==0:
      return divisor
      divisor = divisor + 1
    else:
      divisor = divisor + 1

print(sum_divisors(6)) # Should be 1+2+3=6
print(sum_divisors(12)) # Should be 1+2+3+4+6=16

Ответы [ 4 ]

1 голос
/ 05 февраля 2020

По вашему назначению вы возвращаетесь сразу после нахождения делителя. Вот почему ваша функция не работает Попытайтесь поместить каждый n% делитель == 0 в список и вернуть его в конце времени.

Или попробуйте напечатать его напрямую.

0 голосов
/ 27 апреля 2020
def sum_divisors(n): 
    sum = 0
    z = 1

    while n > z:
        if n % z == 0:
            sum = sum + z
            z = z + 1
        else:
            z = z + 1
    # Return the sum of all divisors of n, not including n
    return sum
0 голосов
/ 05 февраля 2020

Простой поиск в Google приведет вас к ответам с множеством объяснений: сумма делителей в python

Если вы думаете о какой-то эффективности:

нам нужно проверить делители до sqrt числа

import math 
def sum_divisors(num) : 

    # Final result of summation of divisors 
    result = 0

    # find all divisors which divides 'num' 
    i = 2
    while i<= (math.sqrt(num)) : 

        # if 'i' is divisor of 'num' 
        if (num % i == 0) : 

            # if both divisors are same then 
            # add it only once else add both 
            if (i == (num / i)) : 
                result = result + i; 
            else : 
                result = result +  (i + num//i); 
        i = i + 1

    # Add 1 to the result as 1 is also  
    # a divisor 
    return (result + 1); 

print(sum_divisors(6))
print(sum_divisors(12))
0 голосов
/ 05 февраля 2020

это здесь странно:

if n%divisor==0:
      return divisor
      divisor = divisor + 1 //<= this is actually dead code, since is after the return statement...

с другой стороны:

это здесь:

divisor = divisor + 1

работает больше как счетчик, но вам не хватает аккумулятор ...

вы должны сделать что-то вроде

accum = 0
while divisor < n:
    foo = n % divisor
    if foo == 0:
    accum = accum + divisor
...