前言
在 java 中利用计算机特性实现向上取整的巧妙方法
方法
如下公式,如果需要求 y / x 的向上取整,可以直接通过计算右边得到
⌈xy⌉=xy+x−1
正确性
我们知道,对于一个除法来说,有着:
y=kx+b
这样又可以分出两种情况,一种就是余数 b = 0,另一种为余数 b > 0
当余数 b = 0 时,我们向上取整的结果就为 k
而当余数 b > 0 时,向上取整的结果为 k + 1
上面的公式通过这样的转换很容易进行理解,将 y = kx + b 代入上面的公式当中可以得到:
⌈xy⌉=xy+x−1=xkx+b+x−1=k+1+xb−1
接下来对右边分别进行两种情况的讨论
-
当余数 b = 0 时,即可以整除,此时结果变为:
⌈xy⌉=k+1−x1
这里又可以进行分类
- 由于 x 为整数,当 x = 1 时,结果显而易见为 k
- 当 x != 1 且 x > 0,由于计算机中会对小数部分进行舍去,故右边结果为 k
- 同理,当 x < 0 时,右边结果运算为 k
-
当余数 b > 0 时,即不可以整除:
-
当 x > 0 时:
0<b<x−1<b−1<x−x1<xb−1<11−x1<1+xb−1<2
由于结果为大于 1 的小数,故舍弃后的最终结果为 k + 1,符合要求
-
当 x < 0 时:
0<b<x−1<b−1<x−x1>xb−1>11−x1>1+xb−1>2
同理,小数部分舍弃,最终结果为 k + 1,符合要求
总结
这种方法运用的非常巧妙,可以作为思路的启发,当然也可以使用 java 中自带的 Math 类中的静态函数进行向上取整操作