问题如下:
创建一个带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]。
我盯着它但却看不出我做错了什么,它应该是非常简单的。请帮忙!
答案 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页面,了解更多替代算法。