"""
題目:
如果一個數恰好等於它的因子之和,則稱該數為“完全數” 。各個小於它的約數(真約數,列出某數的約數,去掉該數本身,剩下的就是它的真約數)的和等於它本身的自然數叫做完全數(Perfect number),又稱完美數或完備數。
例如:
第一個完全數是6,它有約數1、2、3、6,除去它本身6外,其余3個數相加,1+2+3=6。
第二個完全數是28,它有約數1、2、4、7、14、28,除去它本身28外,其余5個數相加,1+2+4+7+14=28
那么問題來了:如何用python去求出下一個(大於28的)完全數?
(求出1000以內所有的完全數)
"""
#方法一
# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:
tmp=[]
for k in b:
if k<i:
if not i%k:
tmp.append(k)
else:
continue
else:
break
count=0
for m in tmp:
count=count+m
if count==i:
result.append(i)
else:
continue
print result
上面的方法中,求tmp這個list中元素的和時,我們也可以通過sum函數實現,具體如下:
#方法二
# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:
tmp=[]
for k in b:
if k<i:
if not i%k:
tmp.append(k)
else:
continue
else:
break
count=sum(tmp)
if count==i:
result.append(i)
else:
continue
print result
#方法三
#方法三是直接通過遍歷出list a中的元素后,生成一個小於次元素的list,然后取余
#對於range(1,0)我的解釋是:range的理解應該是range是先用我們指定的條件生成一個列表,然后用for循環取出來(此句出自python核心編程第八章),range(1,0),start=1,stop=0,step=1,這樣的條件生成的
#的列表實際是上空的,即為False
a=range(1,1001)
perfect=[]
for i in a:
tmp=[]
for k in range(1,i):
if not i%k:
tmp.append(k)
count=sum(tmp)
if count==i:
perfect.append(i)
print perfect
#方法四(史上最簡單的方式了)
for i in range(1,1000):
s=0
for k in range(1,i):
if i%k==0:
s=s+k
if i==s:
print i