Python 每次可被列表中的一个元素整除的总和

Python 每次可被列表中的一个元素整除的总和,python,Python,鉴于清单: n = [3, 6, 12, 24, 36, 48, 60] 我需要把一个可以被3整除,6整除,12整除,24整除,36整除,48整除,60整除的随机数。一次一个,不能同时为七个数字整除 但是,为了使这个数可以被整除,我需要对另一个数求和,使这个数可以被3,6,12,24,36,48或60整除 我不知道随机数,也不知道要加在这个随机数上,使它可以被3,6,12,24,36,48或60整除的数 有人能帮我吗?澄清问题的新答案: import math def f(x, a):

鉴于清单:

n = [3, 6, 12, 24, 36, 48, 60]
我需要把一个可以被3整除,6整除,12整除,24整除,36整除,48整除,60整除的随机数。一次一个,不能同时为七个数字整除

但是,为了使这个数可以被整除,我需要对另一个数求和,使这个数可以被3,6,12,24,36,48或60整除

我不知道随机数,也不知道要加在这个随机数上,使它可以被3,6,12,24,36,48或60整除的数


有人能帮我吗?

澄清问题的新答案:

import math

def f(x, a):
    return math.ceil(a / x) * x - a

n = [3, 6, 12, 24, 36, 48, 60]
a = 311
result = [f(x, a) for x in n]
print(result)
旧答案:

我认为您正在寻找n中所有数字的LCM(最低公倍数)。我们可以得到两个数(最大公约数)的LCM。然后,我们可以使用reduce获取整个列表的LCM。假设x可以是负数,只需从LCM中减去a即可得到答案。代码可能如下所示:

import math
from functools import reduce

def lcm(a, b):  # lowest common multiple
    return a * b // math.gcd(a, b)

n = [3, 6, 12, 24, 36, 48, 60]
smallest_divisible_by_all = reduce(lcm, n)

a = 311
x = smallest_divisible_by_all - a
print(x)
ns = [3, 6, 12, 24, 36, 48, 60]
a = 311
x = 0

while not all([(a + x) % n == 0 for n in ns]):
    x += 1
哪个输出

409
如果速度不重要,您也可以采用如下暴力解决方案:

import math
from functools import reduce

def lcm(a, b):  # lowest common multiple
    return a * b // math.gcd(a, b)

n = [3, 6, 12, 24, 36, 48, 60]
smallest_divisible_by_all = reduce(lcm, n)

a = 311
x = smallest_divisible_by_all - a
print(x)
ns = [3, 6, 12, 24, 36, 48, 60]
a = 311
x = 0

while not all([(a + x) % n == 0 for n in ns]):
    x += 1

(假设x>=0)

因此我可以想出两种解决方案:

首先,如果您想要一个列表,其中显示要使随机数成为可除数,您必须添加多少:

def divisible(numbers,random):
    l = []
    for number in numbers:
        if random % number != 0:
            l += [number - (random % number)]
        else:
            l += [0]
    return l

a = 311
n = [3, 6, 12, 24, 36, 48, 60]

print(divisible(n,a))
输出:

[1, 1, 1, 1, 13, 25, 49]
Current number: 311
The next number divisible by any number from the given list: 720
Necessary addition: 409
或者,如果你想知道最小的数字离每个人共享的可除随机数有多远。为此,请看一下如何计算lcm

from math import gcd

def divisible_all(numbers, random):
    lcm = numbers[0]
    for i in numbers[1:]:
        lcm = lcm*i//gcd(lcm, i)
    tempLcm = lcm
    while lcm < random: # in case the lcm is smaller than the random number add lcm until it is bigger (I assume you only allow positive numbers)
        lcm += tempLcm
    return lcm-random

print(divisible_all(n,a))
从数学导入gcd
定义可除_all(数字,随机):
lcm=数字[0]
对于以数字表示的i[1:]:
lcm=lcm*i//gcd(lcm,i)
模板CM=lcm
lcm
输出:

[1, 1, 1, 1, 13, 25, 49]
Current number: 311
The next number divisible by any number from the given list: 720
Necessary addition: 409
409你可以做:

导入数学
n=[3,6,12,24,36,48,60]
div_n={el:False表示n}中的el
a=311
a0=数学单元(a/max(n))*max(n)
虽然并非所有(div\n.values()):
div_n={el:False表示n}中的el
#打印(a0)
对于n中的el:
如果(a0%el>0):
a0=数学单元(a0/el)*el
打破
其他:
div_n[el]=真
打印(a0-a)
输出:

[1, 1, 1, 1, 13, 25, 49]
Current number: 311
The next number divisible by any number from the given list: 720
Necessary addition: 409
409
使用地图功能列表理解:

import random

n = [3, 6, 12, 24, 36, 48, 60]
a = random.randint(start, stop)

result = [a + x - a % x if a % x else a for x in n]
addition = [x - a for x in result]

print(a)
print(result)
print(addition)
start
stop
是随机数的限制

a=311的输出:

 311
[312, 312, 312, 312, 324, 336, 360]
[1, 1, 1, 1, 13, 25, 49]

在作者第一次编辑之前,开始对一个相当不清楚的问题的旧答案

下面的帖子回答了这个问题:
a
之后的下一个数字是哪个,如果不是
a
,它是列表
n
中所有数字的倍数

首先,必须确定列表中数字的最小公倍数
lcm
。为此,对完整列表执行方法
least\u common\u multiple
。然后,模运算检查
a
是否不是数字的倍数。如果是这种情况,则输出
a
。否则,将输出
lcm
的下一个倍数

从数学导入gcd
从functools导入reduce
n=[3,6,12,24,36,48,60]
a=311
定义最小公倍数(x,y):
返回abs(x*y)//gcd(x,y)
lcm=减少(最小公倍数,n)
如果a>0,则结果=a;如果需要,可以更改1,请参阅编辑
mod=结果%lcm
如果mod:
结果+=(lcm-mod)
打印('当前编号:'+str(a))
print('下一个可被给定列表中任何数字整除的数字:'+str(结果))
打印('必要的添加:'+str(结果-a))
输出:

[1, 1, 1, 1, 13, 25, 49]
Current number: 311
The next number divisible by any number from the given list: 720
Necessary addition: 409
编辑:更改代码,使
0
不再是非正
a
的有效结果。
但是,如果有效,您可以在注释部分更改代码:
result=a

您是否正在寻找一种方法,使一个数字可以被所有这些元素整除,或者一个数字列表,每个数字都可以被相应的元素整除?欢迎使用。这不是一个讨论论坛或教程。请花点时间阅读和阅读该页面上的其他链接。花些时间练习这些例子。还有其他在线教程,还有一些很好的在线/mooc计算机科学入门课程,它们在本课程中使用Python。试着先用一个数字而不是列表,然后添加所需的逻辑来循环列表。提示:
num%d==0
如果
num
可被
d
@bruce_skywalker整除,则返回True——对于您所述的问题,我的解决方案是否正确?对于当前问题,答案是312,需要1,偏移量为1,公约数为3(请参阅下面的答案)?您不清楚要查找什么。你说你想让这个数字可以被列表中的所有数字整除,但在这种情况下你说
:311+1=312
,但312不能被36、48或60整除。第一个代码更接近我需要的。我只需要加上这些值[1,1,1,13,25,49]就可以将随机变量除以[3,6,12,24,36,48,60]。@bruce_skywalker如果它解决了你的问题,请将其标记为已回答。不,不,我需要分别计算列表中的每一个除数,而不是simultaneously@bruce_skywalker像这样?是的,没错!它工作得很好。非常感谢你!