我正在研究一个小算法,实际上是一个数学函数,我必须在其中找到一个数字,同时将另一个数字加倍。
例如,我必须找到 206 的范围,同时从 8 开始并将其加倍,即
8 + 8 -> 16 + 8 -> 24 + 8 -> 32 ...
在某些时候必须找到 206 之前最接近的数字,然后需要在该值上再加 8。
是否有任何我可以直接使用的统计或数学公式?
是的,这叫做整数除法。
result_lo = floor(206 / 8) * 8
result_hi = (floor(206 / 8) + 1) * 8
由于您对地板的理解有困难,让我简单地向您描述一下。
floor(x) = the greatest integer less than or equal to x
所以
floor(2.99) = 2
floor(2.00) = 2
floor(-0.99) = -1
为什么 floor(N/8)*8 有效?
我们想要小于等于N的8的最大倍数?
因此,我们希望尽可能多地删除 8,直到它大于 0。
206-8-8-8-8-8-....8=6
除此之外,如果我们减去 8,它会低于 0。所以我们在这里停止。
一个重要的观察是除法只是重复减法。
这意味着除以 206/8 可以得到可以从 206 中减去的 8 的数量。
当输入数限制为正数时,您可以简单地在 C++ 中使用整数除法。这是因为,当您在 C++ 中执行整数除法时,结果会被截断。
即 8/3 将设置为 2。
虽然 8/3 是 2.66,但结果只是整数部分。小数部分被简单地忽略了。(这只是一个简单的解释,对于负整数,您需要遵循)
因此,在 C++ 中,您可以简单地编写:
((N)/8)*8
请不要仅仅因为它有效而使用某些东西,尝试找出它为什么有效!