请问这是实现ceil函数的函数,它工作正常,我想问一下从分母中减去-1的逻辑是什么?
我是编程新手
请帮助
int checkceil(int numerator,int denominator){
return (numerator+denominator-1)/denominator;
}
答案 0 :(得分:2)
分子 n 的形式为n = a * d + b
,其中 b 是n / d的余数。根据定义,其余部分小于 d 。
在C中,n / d的除法返回 a 的整数部分。当 b == 0时,只能将 d-1 加到 n 以获得相同的结果(a d + 0) / d ==(a d + d-1)/ d。对于所有其他余数0<b<d
,该除法返回下一个整数a + 1,即上限。
答案 1 :(得分:2)
由于将两个整数a
和b
相除将始终floor
(截断)结果,因此我们需要找到一些d
(delta),使得{{1} }。
我们如何找到floor(d + a/b) == ceil (a/b)
?这样想吧:
d
,除非ceil(a/b) > floor(a/b)
是整数。因此,除非(a/b)
是整数,否则我们想通过添加(a/b)
来使(a/b)
碰到(或超过)下一个整数。这样d
将等于floor(a/b + d)
。我们希望找到ceil(a/b)
,以便对于整数,它不会完全将它们推到下一个整数,但对于非整数,它将是。
那么d
多少就足够了?
因此,假设d
不是整数,我们可以得到的最小剩余数为(a/b)
。因此,为了使(1/b)
碰到下一个整数,只需加上(a/b)
就可以了。该值小于1,在d = 1 - (1/b)
是整数的情况下不会将(a/b)
撞到下一个整数,但在{的情况下,仍足以将(a/b)
撞到下一个整数{1}}不是整数。
总结起来,我们知道将(a/b)
添加到(a/b)
将实现相等:
d = 1 - (1/b)
。这样我们得到:
(a/b)
用代码编写时,将是:
floor(a/b + d) = ceil(a/b)