python - 返回没有共同因素的数字

时间:2017-09-19 15:25:06

标签: python

问题如下:

  

创建一个带2个输入的函数,一个数字n和一个列表lst。   该函数应返回lst中所有数字的列表   与n(除1之外)不共享共同因素。 n和所有数字   lst将是大于或等于0的正整数。

我的尝试

def no_common_factors (n, lst):

    def uf(n):  #get a set of factors
        factors = []
        i = 2
        while n > 1: 
            if n % i == 0: 
                factors += [i]
                n = n / i
            else: 
                i += 1
        return set(factors)

    factors_n = uf(n)
    no_common = []

    for i in range(0, len(lst)): 
        factors_i = uf(i)
        if factors_n.isdisjoint(factors_i): 
            no_common += [lst[i]]
        else: 
            continue

    return no_common

不起作用:

In [41]: no_common_factors(15, [72,27,32,61,77,11,40])
Out[41]: [72, 27, 32, 77]

什么时候应该返回[32,61,77,11]。

我盯着它但却看不出我做错了什么,它应该是非常简单的。请帮忙!

2 个答案:

答案 0 :(得分:3)

您的错误在factors_i计算中。

替换:

factors_i = uf(i)

人:

factors_i = uf(lst[i])

顺便说一下,您可以简化代码:

def no_common_factors(n, lst):
    factors_n = uf(n)
    no_common = []

    for integer in lst:
        factors_i = uf(integer)
        if factors_n.isdisjoint(factors_i):
            no_common.append(integer)

    return no_common

答案 1 :(得分:2)

我会使用math.gcd来做,它返回两个数字的最大公约数:

import math

def no_shared_factors(num, items):
    return [item for item in items if math.gcd(item, num) == 1]

输出正确的结果:

>>> no_shared_factors(15, [72, 27, 32, 61, 77, 11, 40])
[32, 61, 77, 11]

如果math.gcd太多是黑盒子,您可以编写自己的实现或查看math代码(请参阅Code for Greatest Common Divisor in Python):

def gcd(a, b):
    """
    Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
        a, b = b, a % b
    return a

查看Wikipedia上的GCD页面,了解更多替代算法。