码迷,mamicode.com
首页 > 其他好文 > 详细

相亲数

时间:2016-06-13 15:51:07      阅读:521      评论:0      收藏:0      [点我收藏+]

标签:python 相亲数

程序地址: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


代码分析:核心函数没变,只不过加了一个函数,该函数不仅进行枚举判断操作而且对输出的数进行了过滤,而我的输出了全部,也把完全数输出了;

相亲数

标签:python 相亲数

原文地址:http://jmbzs.blog.51cto.com/9449309/1788563

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!