Алгоритм Python для поиска идеальных чисел - PullRequest
0 голосов
/ 24 октября 2018

Пожалуйста, не могли бы вы помочь исправить этот код!Это для нахождения всех идеальных чисел ниже установленного предела в 10000, я использовал комментарии, чтобы объяснить, что я делаю.Спасибо!

#Stores list of factors and first perfect number
facs = []
x = 1

#Defines function for finding factors
def findfactors(num):

    #Creates for loop to find all factors of num
    for i in range(1, num + 1):
        if num % i == 0:

        #Stores factor in facs
        facs.append(i)


#Activates loop
while x < 10000:

    #Finds factors of x and appends them to list
    findfactors(x)

    #Finds sum of list
    facsum = sum(facs)

    #Makes decision based on  sum of factors and original number
    if facsum == x:

        #Ouputs and increases x
        print(x)
        x += 1

    else:

        #Increases x
        x += 1

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Обнаружена проблема!

Должно было быть:

for i in range(1, num - 1)

Вместо:

for i in range(1, num + 1)

Спасибо всем авторам!

0 голосов
/ 24 октября 2018

Это более простая реализация вашей логики.

x = 1

#Defines function for finding factors
def isperfectnum(num):
sum=0
    #Creates for loop to find all factors of num
    for i in range(1, num ):
        if num % i == 0:
           sum=sum+i
    if sum==num:
        return TRUE
    else 
        return FALSE

#Activates loop

while x < 10000:

    #Finds perfect numbers
    if isperfectnum(x):
       print(x)
    x=x+1
0 голосов
/ 24 октября 2018

В теории чисел совершенное число - это положительное целое число, равное сумме его собственных положительных делителей, то есть сумме его положительных делителей, исключая само число (также известное как его аликвотная сумма),Первое совершенное число - 6. Следующее совершенное число - 28. Далее следуют совершенные числа 496 и 8128. ( Википедия )

Вы должны исключить само числоиз списка факторов.

Кроме того, для каждого x вы должны начать с пустого facs, а затем добавить к нему.Вы не хотите, чтобы предыдущие числовые факторы в этом списке.Следующий код работает.

x = 1

def findfactors(num):
    facs = []
    for i in range(1, num):
        if num % i == 0:
            facs.append(i)
    return facs


while x < 10000:
    facs = findfactors(x)
    facsum = sum(facs)
    if facsum == x:
        print(x)
        x += 1
    else:
        x += 1
0 голосов
/ 24 октября 2018

список инициализации внутри def и return, и диапазон не должен включать исходный num, поэтому диапазон будет от 1 до num, который включает 1, но исключает оригинал num, поэтому он будет генерировать диапазон от 1 до num-1

#Stores list of factors and first perfect number
x = 1
#Defines function for finding factors
def findfactors(num):
    facs = []
    for i in range(1, num):
        if num % i == 0:
            #Stores factor in facs
            facs.append(i)

    return facs

#Activates loop
while x < 1000:

    #Finds factors of x and appends them to list
    facs=findfactors(x)

    #Finds sum of list
    facsum = sum(facs)

    #Makes decision based on  sum of factors and original number
    if facsum == x:
        #Ouputs and increases x
        print(x)
    x+= 1

Гораздо быстрее, чем создание списка Подход из Какой самый эффективный способ найти все факторы числа в Python?

#Stores list of factors and first perfect number
x = 1
#Defines function for finding factors
from functools import reduce

def factors(n):
    return set(reduce(list.__add__, 
                ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

#Activates loop
while x < 10000:
    #Finds factors of x and appends them to list
    facs=factors(x)
    facs.remove(x) # remove original number as it is not required further

    #Finds sum of list
    facsum = sum(facs)

    #Makes decision based on  sum of factors and original number
    if facsum == x:
        #Ouputs and increases x
        print(x)
    x+= 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...