在C语言中,取整操作总是把小数部分截断。因此当操作数为正的时候,相当于向下取整。
以下讨论的方法都是操作数为正的情况,操作数为负和浮点数的情况不作讨论。
方法一:检查余数
int func1(int x, int n)
{
int sum = x / n;
if( x % n )
{
sum++
}
return sum;
}
方法二:增加一点小处理(推荐)
int func1(int x, int n)
{
return ( (x+n-1)/n );
}
证明:
- 如果x能被n整除,设x=kn,k为整数,即x为n的整数倍。则(x+n-1)/n=(kn+n-1)/n=((k+1)n-1)/n,此时分子没有达到n的k+1倍,但大于等于n的k倍。默认计算取下整则为k。符合要求。
- 如果x不能被n整除,设x=kn+m,k为整数,m为整数且0<m<n。则(x+n-1)/n=(kn+m+n-1)/n=((k+1)n+m-1)/n。此时分子的大于等于(k+1)n,小于(k+2)n。按照默认计算应该为k+1。符合要求。
这种方法的问题是如果x和n都比较大的情况下,可能会产生溢出。
方法三
(int)(((float)x/(float)n)+0.9))
参考: