确定第一个整数,该整数可以被整数列表中的所有其他整数整除

时间:2016-08-09 14:37:46

标签: python

def divisible(a):

    d = 0
    n = len(a)
    i = 0
    p = 0
    while d == 0 and p < n and i < n:
        if a[i] % a[p] != 0:
            i = i + 1
            p = 0
        else:
            p = p + 1

    return d

a = [12, 4, 6]
r = divisible(a)
print(r)

任何人都可以帮助我吗?它是python 3.0 +。我无法解决这个问题,我不知道在哪里可以将d放入函数中。比如让d = a [i]如果a [i]可以被所有其他整数整除。对于这个问题,答案是12,任何人都可以改变我的代码问题吗?谢谢!!

3 个答案:

答案 0 :(得分:2)

简短的解决方案是

def divisible(a):
    for i in a:
        if all(i%j==0 for j in a):
            return i
    return None

或更长一点

def divisible(a):
    for i in a:
        found=True
        for j in a:
            if i%j: # everything that is not 0 is true
                found=False
                break
        if found:
            return i
    return None

答案 1 :(得分:0)

我认为你正在寻找最不常见的多重算法,在python3中你可以像这样编码:

from fractions import gcd
from functools import reduce


def lcm(*args):
    return reduce(lambda a, b: a * b // gcd(a, b), args)

print lcm(4, 6, 12)

但由于教育目的,您似乎无法在算法中使用任何函数或python内置运算符。那么一个可能的简单解决方案就是这样:

def divisible(input_list):
    result = None

    if 0 in input_list:
        return result

    for i in input_list:
        ok = True
        for j in input_list:
            if i!=j and i % j != 0:
                ok = False
                break

        if ok:
            return i

    return result

答案 2 :(得分:0)

我已经花了我之前的评论。我们不需要实际计算任何倍数,因为我们预计它已经在列表中。诀窍就是采取最大值(如果允许负数则采用最小值),然后验证。

但首先,弄清楚你将如何处理0.它可以被所有其他整数整除,并且本身不能除以任何整数,所以我只是在这个例子中返回0。

如果您确定没有正确答案,还要决定要做什么。我返回了None,但根据应用程序,异常可能更合适。

def divisible(input_list):
    # what to do with zero?
    if 0 in input_list:
        return 0
    # get largest magnitude
    candidate = max(map(abs, input_list))
    # validate
    if all([0 == candidate % x for x in input_list]):
        return candidate
    else:
        # handle the case where there is no valid answer
        return None

print divisible([12, 4, 6])
print divisible([-12, 4, 6, -3])
print divisible([12, 5, 7])
print divisible([12, 0, 4])

这与janbrohl的回答有一些相似之处,但这是一个O(n ** 2)解决方案,检查每个数字与其他所有数字。但我们知道我们想要的数字将是最大的(数量级)。

矛盾证明:取两个正数[a,b],其中a&lt; b,并假设a可被b整除。但是然后a%b == 0。因为a&lt; b,我们知道a%b是a。因此a = 0或a = nb(对于某些n)。但是&lt; b,因此a == 0。 (自己扩展为有符号整数。符号与确定可分性无关。)