c语言--向上取整
向上取整
假如一盒有m支笔(只按盒出售),如果需要n支笔则至少应该买几盒,这就是一个典型的n/m向上取整的问题
n = x * m + r ,0 <= r < m,x >=0.
如果 让 n 加上 m - 1 ,则变为求( n + m - 1) / m【这里是int型的除法,我们只取商的整数部分】
( n + m - 1) / m = ( x * m + r + m - 1) / m = ((x+1) * m + r - 1 ) / m
((x+1) * m + r - 1 ) / m
在c语言的整数除法中采用整数除法的截断规则
当两个整数进行除法运算时,C 语言会执行整数除法,其结果会丢弃小数部分,保留整数部分
对于被除数((x+1) * m + r - 1 )
若 r = 0 ,m可以整除 n, 即n / m = k,即 n = x * m,带入得((x+1) * m - 1 ) , x*m <=(x+1) * m - 1 < (x+1)*m
向下取整除法得 ((x+1) * m + r - 1 ) /m = x.
实际上若m可以整除 n,(n+m-1)/ m = k,因为(m - 1)/m整数部分为0.
若 0 < r < m,m不可以整除 n,即 1 <= r < m,((x+1) * m + r - 1 ) =((x+1) * m + (r - 1) ) , 0 <= r - 1 < m -1,
(x+1) * m <= (x+1) * m + (r - 1) < (x+2)*m
向下取整除法得 ((x+1) * m + r - 1 ) /m = x+1.
至此( n + m - 1) / m实现向上取整。
其实原理很简单,完全可以类比于对整数的向上取整,n÷m=整数.小数,r就是小数,m就是这里的整数1,对于n + m - 1,如果n÷m只有整数,那加上这个比1小的小数m - 1,整数不会改变,截断后只会保留整数,对于有小数的情况,小数至少是,m - 1 对应为小数
, n + m -1必然使整数加1。
Python中的 // 也符合c语言的这种整数除法
(n + a - 1) // a 是 Python 里计算 “向上取整” 的 “小技巧”

浙公网安备 33010602011771号