在处理整数除法时,有没有办法收集类似的术语?

时间:2013-06-08 19:12:53

标签: math integer-division

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

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

在处理整数除法时,有一种方法可以将x/4 + x/2缩减为这种形式: x * (int1/int2)?如果是这样,怎么样?

2 个答案:

答案 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。利用42的倍数。

注意:从|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;
  }