在处理整数除法时,有没有办法收集同类项?

Posted

技术标签:

【中文标题】在处理整数除法时,有没有办法收集同类项?【英文标题】:When dealing with integer division, is there a way to collect like terms? 【发布时间】:2013-06-08 19:12:53 【问题描述】:

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

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

在处理整数除法时,有没有办法将x/4 + x/2 简化为这种形式: x * (int1/int2)?如果有,怎么做?

【问题讨论】:

这是题外话;试试math.stackexchange.com。 但答案是:不。如果 x = 4,则结果为 3。不能作为单个整数乘法或除法的结果获得。 (x * 3)/ 4 为您提供正确的结果,并且只进行一次除法,但与您要求的形式不完全相同。 @AdamRosenfield:但不是,因为 (3*3)/4 = 2 而 3/4+3/2 = 0+1 = 1。 你可以,但它会非常复杂。基本上,整数除法会截断任何余数,所以你可以自己做,比如 (x - x % 4) /4 + (x - x % 2) / 2 ...你可以把它工作到 x * 3 / 4 - (x % 4 + 2 * x % 2) / 4 ...检查我的数学(我想我弄错了),但重点是痛苦多于其价值。 【参考方案1】:

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 的倍数。

注意:以INTMAX/3*2 左右开头的大|x| 仍有可能溢出。


测试代码

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;
  

【讨论】:

【参考方案2】:

我认为你无法做到这一点。举个例子

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

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

【讨论】:

以上是关于在处理整数除法时,有没有办法收集同类项?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法防止opencv矩阵除法中的舍入

如何在整数算术中执行上限除法? [复制]

无论结果如何,支持除以零的最快整数除法是啥?

在python中处理长整数除法[重复]

C中的类型混合整数除法:编译器错误或定义的行为?

LeetCode第二十九题-整数除法