寻找完美数的Python算法

寻找完美数的Python算法,python,python-3.x,while-loop,factors,Python,Python 3.x,While Loop,Factors,请你帮我更正这个代码!这是为了找到所有低于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

请你帮我更正这个代码!这是为了找到所有低于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
#存储因子列表和第一个完美数
facs=[]
x=1
#定义查找因子的函数
def findfactors(num):
#创建for循环以查找num的所有因子
对于范围内的i(1,num+1):
如果num%i==0:
#facs中的存储因子
附件(一)
#激活循环
当x<10000时:
#查找x的因子并将它们附加到列表中
findfactors(x)
#查找列表的和
facsum=总和(facs)
#根据因素和原始数量之和做出决策
如果facsum==x:
#输出并增加x
打印(x)
x+=1
其他:
#增加x
x+=1

初始化def内的列表并返回,范围不应包括原始的
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
#存储因子列表和第一个完美数
x=1
#定义查找因子的函数
def findfactors(num):
facs=[]
对于范围内的i(1,num):
如果num%i==0:
#facs中的存储因子
附件(一)
返回facs
#激活循环
当x<1000时:
#查找x的因子并将它们附加到列表中
facs=FindFactor(x)
#查找列表的和
facsum=总和(facs)
#根据因素和原始数量之和做出决策
如果facsum==x:
#输出并增加x
打印(x)
x+=1
比生成列表快得多 接近

#存储因子列表和第一个完美数
x=1
#定义查找因子的函数
从functools导入reduce
def系数(n):
返回集(减少(列表),
([i,n//i]表示范围(1,int(n**0.5)+1)内的i,如果n%i==0)))
#激活循环
当x<10000时:
#查找x的因子并将它们附加到列表中
facs=系数(x)
facs.删除(x)#删除原始编号,因为不再需要该编号
#查找列表的和
facsum=总和(facs)
#根据因素和原始数量之和做出决策
如果facsum==x:
#输出并增加x
打印(x)
x+=1

这是一个更简单的逻辑实现

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
x=1
#定义查找因子的函数
def isperfectnum(数值):
总和=0
#创建for循环以查找num的所有因子
对于范围内的i(1,num):
如果num%i==0:
sum=sum+i
如果sum==num:
返回真值
其他的
返回错误
#激活循环
当x<10000时:
#寻找完全数
如果isperfectnum(x):
打印(x)
x=x+1

在数论中,完美数是相等的正整数 它的正因子之和,也就是它的 不包括数字本身的正因子(也称为 等分总和)。第一个完全数是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
x=1
def findfactors(num):
facs=[]
对于范围内的i(1,num):
如果num%i==0:
附件(一)
返回facs
当x<10000时:
facs=FindFactor(x)
facsum=总和(facs)
如果facsum==x:
打印(x)
x+=1
其他:
x+=1
找到了问题

应该是:

for i in range(1, num - 1)
而不是:

for i in range(1, num + 1)

感谢所有的贡献者

您是否介意用以下内容扩展这个问题:您希望代码做什么,以及(更重要的是)它在做什么?它是否会产生错误信息?如果是,请将这些信息包括在您的问题中。首先检查数字是偶数还是奇数,然后在范围中添加一个步长参数将删除一半不需要的值,因为奇数不可能有偶数因子。这只是一个想法。@meissner\u我希望代码返回10000以下的所有完美数字,但它只打印我最初设置x的“1”。没有错误消息。对不起,我是新来的堆栈溢出@疯了?恐怕我不知道这意味着什么,因为我根本不是专家!在数论中,一个完美数是一个正整数,它等于它的正因子之和,也就是说,它的正因子之和不包括这个数本身(也称为它的等分和)。第一个完全数是6。下一个整数是28。然后是完全数496和8128。()所以,你必须排除数字本身,但要包括1。不要只是张贴代码,解释你为什么会这样做conclusion@Igoranze我之前在代码中说过,我忽略了1是其中的一个因素,但也添加了解释。当我尝试这一点时,它返回的是素数而不是完美数……仍然不起作用。检查我的答案。如果有帮助,请随意接受。
num=6;列表(范围(1,num-1))
您确定要范围到num-1而不是num吗?
for i in range(1, num + 1)