我想知道是否有一个数学表达式可以用来查找两个数字之间的关系。
输入和预期输出的一些示例如下:
Input Multiple Result
4 3 3
6 3 6
8 3 6
4 4 4
12 4 12
16 5 15
另外,Wolfram Alpha 的下面的表达式向我展示了预期的结果,但由于它们没有详细说明如何做到这一点,所以我无法向它们学习...
尝试使用
//
和 %
运算符!
对于
//
,你会做
Result = (Input // Multiple) * Multiple
通过这种方式,您可以获得“多重”适合输入的次数 - 然后将该数字与“多重”本身相乘,从而得到预期的结果!
编辑:如何用模
%
来做到这一点?
Result = Input - (Input % Multiple)
摘自MCO的回答!
您可以为此使用模数。例如,计算小于或等于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
我会这样做:
return int(input / multiple) * multiple
它会截断除法,以便得到一个可以相乘的整数。
这可能很琐碎,但非常容易理解。考虑倍数是否为负数或零
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]
以下是之前方法的时间比较。
请注意,我将除数保留为 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()