Python: 亲和数检查

1 投票
3 回答
4106 浏览
提问于 2025-04-18 04:25

我需要写一个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

定义,友好数来自维基百科

友好数是两个不同的数字,它们之间有一种特殊的关系:每个数字的所有适当因子的和等于另一个数字。(适当因子是指一个数字的正因子,但不包括这个数字本身。)

简单来说:

  1. 两个不同的数字 好的
  2. 每个数字的适当因子的和 好的
  3. 等于另一个数字 好的

那么:

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

撰写回答