Python: 亲和数检查
我需要写一个Python函数,来判断两个数字(m,n)是否是友好数。友好数是指两个不同的数字,它们的真因子之和等于对方的数字。
我在这里卡住了。
def ami_check(m,n):
我会很感激大家的帮助。
3 个回答
0
这是一个尝试,
def factors(n):
return sorted(reduce(list.__add__,
([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))[:-1]
def ami_check(m,n):
return sum(factors(m)) == n and n != m
结果
In [1]: ami_check(220,284)
Out[1]: True
In [2]: ami_check(5545,21654)
Out[2]: False
In [3]: ami_check(2620,2924)
Out[3]: True
0
你可以使用这段代码来检查友好数。
def sumPropDiv(n):
"""returns sum of proper divisors of n"""
dSum = 0
for x in range(1, n/2 + 1):
if n % x == 0:
dSum += x
return dSum
def amicSum(number):
"""finds the sum of all amicable numbers less than number, with number greater than 4."""
answer = 0
for x in range(4, number):
if sumPropDiv(x) > 4:
if sumPropDiv(sumPropDiv(x)) == x and sumPropDiv(x) != x:
answer += x
print x, "and", sumPropDiv(x), "are an amicable pair."
return answer
print amicSum(10000)
4
定义,友好数
来自维基百科:
友好数是两个不同的数字,它们之间有一种特殊的关系:每个数字的所有适当因子的和等于另一个数字。(适当因子是指一个数字的正因子,但不包括这个数字本身。)
简单来说:
两个不同的数字
好的每个数字的适当因子的和
好的等于另一个数字
好的
那么:
def ami_check(x,y):
if x==y: return False # 1
sum_x=sum(e for e in range(1, x//2+1) if x%e==0) # 2
sum_y=sum(e for e in range(1, y//2+1) if y%e==0) # 2
return sum_x==y and sum_y==x # 3