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像这样?是的,没错!它工作得很好。非常感谢你!