這種方法采用的是捨去小數部分。
‘ / ’本身就有取整功能(int / int),但是整數除法對負數的取整結果和使用的C編譯器有關。
floor(x)返回的是小於或等於x的最大整數。如:
floor(3.5) = 3
floor(-3.5) = -4
ceil(x)返回的是大於x的最小整數。如:
ceil(3.5) = 4
ceil(-3.5) = -3
floor()是向負無窮大捨入,floor(-3.5) = -4;
ceil()是向正無窮大捨入,ceil(-3.5) = -3。
但是在C裡面ceil和floor()函數是返回double型。
在網上發現一個簡單的向上取整方法;
這裡我們用<>表示向上取整,[]表示向下取整,我們可以證明:
不失一般性,我們設N = Mk+r (0 <= r < M,k∈Z),
(1)當r > 0時,
左邊:
右邊:[(N-1)/M]+1 = [(Mk+r-1)/M]+1 = [k+(r-1)/M]+1 = k+1+[(r-1)/M]=k+1
(2)當r = 0時,
左邊:
右邊:
[(N-1)/M]+1 = [(Mk-1)/M]+1 = [(M(k-1)+M-1)/M]+1
= [k-1+(M-1)/M]+1 = k+[(M-1)/M]
= k
綜上,命題得證。
有了這個公式,我們在代碼裡可以這樣計算:
int nn = (N-1)/M +1
式中' / '是往下取整的。