0

我正在研究一个小算法,实际上是一个数学函数,我必须在其中找到一个数字,同时将另一个数字加倍。

例如,我必须找到 206 的范围,同时从 8 开始并将其加倍,即

8 + 8 -> 16 + 8 -> 24 + 8 -> 32 ...

在某些时候必须找到 206 之前最接近的数字,然后需要在该值上再加 8。

是否有任何我可以直接使用的统计或数学公式?

4

2 回答 2

3

是的,这叫做整数除法。

result_lo = floor(206 / 8) * 8
result_hi = (floor(206 / 8) + 1) * 8
于 2013-06-30T20:29:30.507 回答
2

由于您对地板的理解有困难,让我简单地向您描述一下。

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

请不要仅仅因为它有效而使用某些东西,尝试找出它为什么有效!

于 2013-07-01T07:54:56.983 回答