Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
9年前关闭。
我偶然发现
int a = (h/2)*w+ (  (h+1)/2-h/2   )  *  (w+1)/2 ;

等于
int b = (w * h + 1) / 2 ;

当w和h是正整数时(假定没有溢出)。
你能告诉我为什么这两个是一样的吗?
编辑:整数->正整数。

最佳答案

实际上这是一个数学问题:(integer)/2应该解释为floor。所以,问题是:
表明floor(h/2)*w + ( floor((h+1)/2) - floor(h/2) ) * floor((w+1)/2)等同于floor((w*h+1)/2)
证明:
h=2k,w=2l:(两个数字都是偶数)。。。
h=2k+1,w=2l:。。。
h=2k,w=2l+1:。。。
h=2k+1,w=2k+1:。。。
提示:floor((2k+1)/2) == k。你可以很容易地证明等价性。
例如,案例4:
a)floor(2k+1/2)*(2l+1) + ( floor((2k+2)/2) - floor((2k+1)/2) ) * floor((2l+2)/2) = 2kl+k + (k+1 - k)*(l+1) = 2kl + k + l + 1
b)floor(((2k+1)*(2l+1)+1)/2) = floor((4kl+2k+2l+2)/2) = 2kl + k + l + 1
因此,这两个方程是等价的。

关于c - C/C++整数操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1713120/

10-10 17:51