在处理整数除法时,有没有办法收集同类项?
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
。它利用了4
是2
的倍数。
注意:以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
我并不是要声称不存在与此类似的某种身份是正确的。
【讨论】:
以上是关于在处理整数除法时,有没有办法收集同类项?的主要内容,如果未能解决你的问题,请参考以下文章