程序地址:http://www.cheemoedu.com/exercise/14
问题描述:
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
代码分析:核心函数没变,只不过加了一个函数,该函数不仅进行枚举判断操作而且对输出的数进行了过滤,而我的输出了全部,也把完全数输出了;
时间: 2024-10-08 08:16:46