首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定可被整数列表中的所有其他整数整除的第一个整数

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

Stack Overflow用户
提问于 2016-08-09 22:37:46
回答 3查看 138关注 0票数 0
代码语言:javascript
复制
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放到函数的什么地方。例如,如果ai可以被所有其他整数整除,则设d= ai。这个问题的答案是12,有人能改进我的代码吗?谢谢你!!

EN

回答 3

Stack Overflow用户

发布于 2016-08-09 22:45:15

一个简短的解决方案是

代码语言:javascript
复制
def divisible(a):
    for i in a:
        if all(i%j==0 for j in a):
            return i
    return None

或者更长一点

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-08-09 22:45:46

我认为你正在寻找最不常见的乘法算法,在python3中你可以这样编写它:

代码语言:javascript
复制
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内置运算符,因为这是出于教育目的。那么一种可能的简单解决方案可能是这样的:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2016-08-09 23:14:31

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

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

如果你确定没有正确的答案,也要决定你会怎么做。我返回了None,但根据应用程序的不同,异常可能更合适。

代码语言:javascript
复制
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< b,假设a可被b整除,但a%b == 0。由于a < b,我们知道a%b是a。因此a=0或a=nb (对于某些n)。但是a< b,因此是a==0。(自己扩展到带符号的整数。该符号在很大程度上与确定可分性无关。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38853789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档