例如,当不使用整数除法时,以下是真的
x/4 + x/2 = x*(1/4+1/2) = x * 3/4
在处理整数除法时,有一种方法可以将x/4 + x/2
缩减为这种形式:
x * (int1/int2)
?如果是这样,怎么样?
答案 0 :(得分:0)
我认为你无法做到这一点。举个例子
5 \ 3 + 5 \ 2 = 1 + 2 = 3
其中\
表示整数除法。
现在用常规划分
查看相同的表达式a / b + a / c = a(b + c) / bc
如果我们尝试将此规则应用于上述示例,请将\
替换为/
,我们会得到:
5 \ 3 + 5 \ 2 = 5(3 + 2) \ (2 * 3) = 25 \ 6 = 4 [wrong answer!]
^^^
This must be wrong
我并没有试图声称不存在某种类似于 正确的身份。
答案 1 :(得分:0)
问题reduce x/4 + x/2 into this form: x * (int1/int2)
似乎不是您想要的查询。在(int1/int2)
中强制int3
除法第一个简单结果。
让我们一起工作
reduce x/4 + x/2 into this form: (x * int1)/int2
正如其他人所提到的那样,有一些问题暗示了它的不可能性。因此,我将提出另一种可能适合您的表单,因为它仍然可以访问x
并且没有分支。
reduce x/4 + x/2 into this form: ((x/int1)*int2)/int3
x/4 + x/2
缩减为((x/2)*3)/2
。利用4
是2
的倍数。
注意:从|x|
开始,大型INTMAX/3*2
仍有可能出现溢出。
测试代码
int test2(int x) {
int y1 = x/4 + x/2;
int y2 = ((x/2)*3)/2;
printf("%3d %3d %3d %d\n", x, y1, y2, y1==y2);
return y1==y2;
}