问题描述:
220的真因数之和为1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为1+2+4+71+142=220
毕达哥拉斯把这样的数对A、B称为相亲数:A的真因数之和为B,而B的真因数之和为A。
求100000以内的相亲数。
我的代码:
def perfect(n):
a=1
b=n
s=0
while a<b:
if n%a==0:
s=s+a+b
a=a+1
b=n/a
if a==b and a*b==n:
s=s+a
return s-n
for i in xrange(1,100000):
if perfect(perfect(i))==i:
print i,perfect(i)
我的结果:
10000以内为例:
6 6 #完全数
28 28 #完全数
220 284
284 220
496 496 #完全数
1184 1210
1210 1184
2620 2924
2924 2620
5020 5564
5564 5020
6232 6368
6368 6232
8128 8128 #完全数
我的思路:
因为昨天做过了完全数的练习(http://www.cheemoedu.com/exercise/13),所以直接采用哪个快速求数的约数之和的函数,而剩下的就好办了,就是枚举判断输出了;
示例代码:
def sumOfFactors(k):
p = 1
q = k
s = 0
while p < q:
if k % p == 0:
s += p + q
p += 1
q = k / p
if k == p * q and p == q:
s += p
return s - k
def fun(start, end):
for x in range(start, end):
y = sumOfFactors(x)
if x < y and sumOfFactors(y) == x:
print x, y
fun(2, 100000)
示例结果:
10000以内为例:
220 284
1184 1210
2620 2924
5020 5564
6232 6368
代码分析:核心函数没变,只不过加了一个函数,该函数不仅进行枚举判断操作而且对输出的数进行了过滤,而我的输出了全部,也把完全数输出了;