(Python)用python完成计算亲和数对(相亲数、友爱数)、完备数(完全数、完美数)

(Python)用python完成计算亲和数对(相亲数、友爱数)、完备数(完全数、完美数)

  • 一、亲和数
  • 二、完全数
  • 三、整体编写

PS:因为在做刷题的时候遇到了,所以想记录下来

一、亲和数

相亲数(Amicable numbers),又称亲和数、友爱数、友好数,指两个正整数中,彼此的全部正约数之和(本身除外)与另一方相等。
解释如下:
220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1+2+4+71+142,加起来恰好为220。
所以这里的220和284为一组亲和数对。

二、完全数

完全数(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
所以,6和28是完全数。此外,还有496、8128也是完全数。
而对于自然数16,除去它本身16外,其余的约数相加,1+2+4+8=15,所以16不是完全数。

三、整体编写

这里用Python来实现,代码如下:

# 亲和数对
def qhs(n):
    # 用mSum记录真因子的和,初始化置为1
    nSum = [1] * (n + 1)
    a = []
    for i in range(2, int(n / 2 + 1)):
        j = 2 * i
        while j <= n:
            nSum[j] += i
            j += i
    # 第一个亲和数为220
    for i in range(220, n + 1):
        if i < nSum[i] <= n and i == nSum[nSum[i]]:
            a.append([i, nSum[i]])
    print(f"{n}以内的亲和数对有: ", a)

# 完备数
def wqs(n):
    a = []
    for i in range(1, n):
        s = 0
        for j in range(1, i):
            if i % j == 0 and j < i:
                s += j
        if s == i:
            a.append(i)
    print(f"{n}以内的完全数有:{a}")

if __name__ == '__main__':
    qhs(30000)
    wqs(1000)

结果如下:
完全数和亲和数对

如果您有更好的方式计算方式请在评论区讨论吧!

你可能感兴趣的:(python,开发语言)