【转】C语言中整型运算取Ceiling问题
原文: http://blog.csdn.net/laciqs/article/details/6662472
-------------------------------------------------------
此题来自:《Linux C编程一站式学习》
假设变量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,当b=0时,
(x+z)/n=k,即(kn+z)/n=k,根据题目要求,z最大为n-1;
当b≠0时,(x+z)/n=k+1,即(kn+b+z)/n=k+1,也就是(b+z)/n=1,由于b∈(0, n)且b∈Z,故b可取最小值1,此时z为n-1,当b取2时,z为n-2……当b=n-1时,z=1,可见不考虑特殊情况时,z最大为n-1;而当b=n-1时,z若为n-1,则(b+z)/n=2-2/n<2,也就是(kn+b+z)/n<k+2,依然可以取Ceiling。所以无论怎样z都可为n-1,即z=n-1。
∈[1, n-1],∵[
所以这个表达式应该写为:(x+n-1)/n
而且从上面的推导过程可以看出,对于x%n=n-1的情况,只要再给x加上一个1就可以取Ceiling,比如19%4=3,(19+1)/4=5。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现