到目前为止,我已经了解了for循环,if语句和计数,因此仅使用这些主题来获得反馈将是很棒的。我正在尝试解决“完美数”问题,其中除数之外的除数等于该数。因此,对于6,除数1,2,3总计为6。我曾尝试查看其他文章,但我想知道为什么我的代码特别无法正常工作。我已经尝试解决了这个问题,但我觉得我快到了。我只有一个问题。这是我到目前为止的内容:
num = 30
for i in range(1,num+1):
count = 0
for k in range(1,num+1):
if i%k == 0 and i!=k:
count += k
if count == i:
print(k,'Perfect',i)
shell的输出给了我这个
3 Perfect 6
8 Perfect 24
14 Perfect 28
我知道24不是一个完美的数字。除24之外的24的最高除数应该是12,但是我得到8。这就是为什么它向我显示24是完美的。谁能说清楚为什么我无法获得12分?
答案 0 :(得分:2)
您必须计算所有除数,在得出结论之前,您的代码将24乘以8,然后求和所有到目前为止的除数,并声明24为一个完美的数字,不要等待其他除数出现。
您的代码应如下所示:
for i in range(1,num+1):
count = 0
for k in range(1,i): # no point searching for numbers greater than i
if i%k == 0 :
count += k
if count == i:
print('Perfect',i)
并产生:
('Perfect', 6)
('Perfect', 28)
答案 1 :(得分:1)
您的问题是您要检查count == i
是否在错误的位置。您需要检查整个count
的总和,而不是每次添加count
的总和之后。
num = 30
for i in range(1,num+1):
count = 0
for k in range(1,num+1):
if i%k == 0 and i != k:
count += k
if count == i:
print(k,'Perfect',i)
此外,如果您想要稍微更高效的代码,则可以事后进行减法运算,而不用检查每个值。另外,正如lenik所建议的那样,您只需要数i
(因为i
的除数不能大于其自身。)更有效的是,人们可以只使用Sieve of Eratosthenes-类似的方法,然后计数到sqrt(i)+1
,并在此过程中找到相应的因素:
from math import sqrt
num = 30
for i in range(1,num+1):
count = 0
for k in range(1,sqrt(i) + 1):
if i%k == 0:
count += k
factor = count/k
# The conditional is necessary in case i is a perfect square.
if k != factor:
count += factor
if count - i == i:
print(k,'Perfect',i)
答案 2 :(得分:0)
12不是太太1 + 2 + 3+ 4 + 6!= 12
第二个也有计数问题(将其更改为Forbidden (CSRF token missing or incorrect.): /testv/
)
关键问题是@csrf_exempt
i+1
结果:
3完美6
14完美28