数学函数查找某个范围内数字的最大倍数

问题描述 投票:0回答:5

我想知道是否有一个数学表达式可以用来查找两个数字之间的关系。

输入和预期输出的一些示例如下:

Input    Multiple   Result
4        3          3
6        3          6
8        3          6
4        4          4
12       4          12
16       5          15

另外,Wolfram Alpha 的下面的表达式向我展示了预期的结果,但由于它们没有详细说明如何做到这一点,所以我无法向它们学习...

10 中 4 的最大倍数

12 中 4 的最大倍数

python math
5个回答
8
投票

尝试使用

//
%
运算符!

对于

//
,你会做

Result = (Input // Multiple) * Multiple

通过这种方式,您可以获得“多重”适合输入的次数 - 然后将该数字与“多重”本身相乘,从而得到预期的结果!

编辑:如何用模

%
来做到这一点?

Result = Input - (Input % Multiple)

摘自MCO的回答!


4
投票

您可以为此使用模数。例如,计算小于或等于13的4的最大倍数:

13 % 4 = 1
13 - 1 = 12

在Python中,可能看起来像这样:

def biggest_multiple(multiple_of, input_number):
    return input_number - input_number % multiple_of

所以你将其用作:

$ biggest_multiple(4, 9)
8
$ biggest_multiple(4, 12)
12

4
投票

我会这样做:

return int(input / multiple) * multiple

它会截断除法,以便得到一个可以相乘的整数。


2
投票

这可能很琐碎,但非常容易理解。考虑倍数是否为负数或零

Multiple=[3,3,3,4,4,5,0,-5]
Input=[4,6,8,4,12,16,1,8]
Result=[]
for input,multiple in zip(Input,Multiple):
    if(multiple):
        Result.append((range(multiple,input+1,abs(multiple)))[-1])
    else:
        Result.append(0)
print(Result)

输出:

[3, 6, 6, 4, 12, 15, 0, 5]

0
投票

以下是之前方法的时间比较。

请注意,我将除数保留为 6(这是我的用例)。此外,该图还有一个线性对数轴(比下面的代码更复杂)。

看来

 res = val - (val % div)
在这种情况下是最快的。

import timeit
import matplotlib.pyplot as plt

methods = ["res = int(val / div) * div",
           "res = (val // div) * div",
           "res = val - (val % div)"]
div = 6
repeats = 100_000
times = [[] for method in methods]

for val in range(0, 1_000):
    for i in range(len(methods)):
        duration = timeit.timeit(setup=f"val={val}; div={div}", stmt=methods[i])
        times[i].append(duration)

for i, trend in enumerate(times):
    plt.plot(list(range(0, 1_000)), trend, label=methods[i])

plt.xlabel('Value "v"')
plt.ylabel('Duration (s)')
plt.title("Method comparison;")
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.