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,整数不会改变,截断后只会保留整数,对于有小数的情况,小数至少是\frac{1}{m},m - 1 对应为小数\frac{m-1}{m}, n + m -1必然使整数加1。


Python中的   //  也符合c语言的这种整数除法

(n + a - 1) // a 是 Python 里计算 “向上取整” 的 “小技巧”

posted @ 2025-10-20 12:46  mc12356  阅读(76)  评论(0)    收藏  举报  来源