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)
如果您有更好的方式计算方式请在评论区讨论吧!