转:
此题来自:《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
网上搜索到结果为如下:
1、 if((x%n)>0){result =x/n+1;} else{result=x/n;}
2、(x+n-1)/n);3、(int)(((float)x/(float)n)+0.9))