C语言中整型运算取Ceiling问题补充

写作由来

之前已经有一篇博文通俗易懂地讲解了这个问题,但是解决思路不够全面,导致漏掉了一个解。原文链接如下
http://blog.csdn.net/laciqs/article/details/6662472

求解

题目要求:

假设变量 x 和 n 是两个正整数,我们知道 x/n 这个表达式的结果要取 Floor,例如 x 是 17,n 是 4,则结果是 4。如果希望结果取Ceiling 应该怎么写表达式呢?例如 x 是 17,n 是 4,则结果是 5;x是16,n 是 4,则结果是 4。

求解过程:

设 x=kn+b,b∈[0, n) 且 b∈Z
(1)b=0
(x+z)/n=k,即 (kn+z)/n=k。即 z∈[0,n-1]
(2)b=(0,n)
(x+z)/n=k+1,即 (kn+b+z)/n=k+1,即 (b+z)/n=1,即 (b+z)∈[n,2n-1]
希望找到这样一个 z, b 取遍整个取值区间的值,(b+z)∈[n,2n-1] 仍然成立。只要 b 取最小值和最大值的时候,(b+z)∈[n,2n-1]都成立就可以了。所以,z=n or n-1.
合并一二两种情况,得到 z=n or n-1

思路小结

  1. 分而治之,x 是 17,n 是 4,则结果是 5;x是16,n 是 4,则结果是 4。把题目要求分解为 b=0 和 b=(0,n) 两种情况,然后求交集
  2. 过程种使用的除法是余数和商形式的除法
posted @ 2020-04-27 10:55  孟悦涛  阅读(188)  评论(0)    收藏  举报