相亲数

问题描述:

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


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


题目出处:http://www.cheemoedu.com/exercise/14

转载于:https://my.oschina.net/jmbzs/blog/711981

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值