2013-06-30 67 views
0

我正在研究一个小算法,实际上是一个数学函数,我必须找到一个数字,同时以另一个数字加倍开始。找到一个数字的范围

例如,我必须找到206的范围内,而从8开始,它即

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

倍增在某一点已找到206之前最接近的数字,然后添加进一步8为该值将是必需的。

有没有可以直接使用的统计或数学公式?

+0

冒着听起来天真的风险..你是要求'[floor(206/8)* 8,ceil(206/8)* 8]' – Ioannis

+0

@loannis我想是的,我只是回答说如果你看密切。 – 2013-06-30 20:30:54

+0

@ H2CO3对不起,我没有刷新页面 - 点! – Ioannis

回答

3

是的,它被称为整数除法。

result_lo = floor(206/8) * 8 
result_hi = (floor(206/8) + 1) * 8 
+0

这很棒..谢谢@ H2CO3 ...看起来好像给结果。 –

+0

@FarrukhWheheed:你知道它为什么给出结果吗? – Aravind

+0

那么,我很有兴趣知道这一点。但是请阅读它的内在方面以及那里可怕的数学。即http://www.encyclopediaofmath.org/index.php/Floor_function –

2

由于您在理解地板时遇到困难,请让我简单地向您描述一下。

floor(x) = the greatest integer less than or equal to x 

所以

floor(2.99) = 2 
floor(2.00) = 2 
floor(-0.99) = -1 

为什么地板(N/8)* 8部作品?

我们希望8的最大倍数小于或等于N?

所以我们要删除多达8我们所能,直到它大于0

206-8-8-8-8-8 -.... 8 = 6

除此之外,如果我们减去8它会低于0.所以我们在这里停下来。

一个重要的观察结果是划分是简单的重复减法。

这意味着划分八分之二百零六使我们可以从206

当输入数目限制为正数中减去8的数,然后就可以简单地使用整数除法在C++中。这是因为,当您在C++中执行整数除法时,结果会被截断。

也就是说8/3将被设置为2

虽然8/3是2.66,结果只有整数part.The小数部分被忽略。(这只是一个简单的解释,对于负整数,你需要遵循)因此,在C++

,可以简单的写:

((N)/8)*8 

请不要随便使用的东西,因为它的工作原理,试图找出为什么它的作品!

+1

@Farrukh Waheed,基于Aravind的最后一句话: 如果你不明白它为什么起作用,那么你就不知道它是否真的有效。它只是在你测试它的情况下做你想做的事情,那就是所有.. – Ioannis

+0

非常感谢Aravind对于这样的细节......我肯定会在这个时候继续工作,因为我现在在这个时候沉迷于其他任务..真的很感谢。 –

相关问题