0

例如,当不使用整数除法时,以下为真

x/4 + x/2 = x*(1/4+1/2) = x * 3/4

在处理整数除法时,有没有办法减少x/4 + x/2到这种形式: x * (int1/int2)?如果是这样,怎么做?

4

2 回答 2

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;
  }
于 2013-06-09T21:16:52.490 回答
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

我并不是要声称存在与此类似的某种身份正确的。

于 2013-06-09T20:17:02.800 回答