我编写了一个代码,当输入的数字是一个完美的数字时,输出“是”,而当数字不是一个完美的数字时,输出“否”。但是当我输入6时,它输出“否”。当除数之和等于原始输入时,我已指定它使用if-else语句打印“是”。为什么输出错误?
n=int(input())
myList=[]
for i in range(1,n):
if n%i==0:
myList.append(n)
sum=0
for i in range(0,len(myList)):
sum=sum+myList[i]
if sum==n:
print("Yes")
else:
print("No")
答案 0 :(得分:1)
对于我以前的回答感到困惑,我们深表歉意。问题是您在n
中附加了i
而不是myList.append(n)
。此外,您可以简单地使用sum
来汇总列表。
您的输出是错误的,因为您要附加数字n
,因此,当您执行sum=sum+myList[i]
时,您只是将n
加上了三遍,而不是加上1,2 ,3到sum
,您要添加6、6、6。
n=int(input())
myList=[]
for i in range(1,n):
if n%i==0:
myList.append(i)
if sum(myList)==n:
print("Yes")
else:
print("No")
建议使用的衬纸
print(('No', 'Yes')[sum(i for i in range(1, n) if not n % i) == n])
答案 1 :(得分:0)
其他人已经指出了您的错误,因此这里是您可以对代码进行一些优化的方法。
6( =n)
的除6之外的最大除数是3( = n//2)
,因为我们没有将数字本身加到factors_sum
在检查因子之和是否等于数字时(即在找到理想数时),因此我们不需要检查是否有大于3的数字
是6的因数。
# perfect nums example 6, 28, 496, and 8,128
n = 8128
stop = (n//2) +1 # stop is exclusive thats why extra 1
factors_sum = 0
for i in range(1,stop):
if n % i == 0:
factors_sum += i
print('Yes' if factors_sum == n else 'No') # Yes
'''
benchmark result( using timeit ran each five times)
for smaller value of n there is no significant difference but as the value of n becomes very large you can clear see the difference.
n = 33550336
1) stop = (n//2) +1
6.580396663 ( time in secs)
2) stop = n
12.635774489000001 ( time in secs)
'''