整数除法的性质

7
以下整数算术属性是否成立?
(m/n)/l == m/(n*l)

起初我认为我知道答案(不成立),但现在我不确定了。 它适用于所有数字还是仅适用于某些条件,即n > l

这个问题涉及计算机算术,即q = n/m, q*m != n,忽略溢出。


你是否关心像溢出这样的边缘情况?或者像那些 n/m 向下舍入而不是向零舍入的怪异架构/语言? - Mooing Duck
整数除法中,(a/b)/c 是否等于 a/(b*c)? - phuclv
可能是[在使用整数除法时,将“a /(b * c)”替换为“a / b / c”是否安全?]的重复问题(https://dev59.com/L1cO5IYBdhLWcg3w5lQM)。 - phuclv
2个回答

12
Case1 assume m = kn+b (b<n),
left = (m/n)/l = ((kn+b)/n)/l = (k+b/n)/l = k/l (b/n=0, because b<n)
right = (kn+b)/(n*l) = k/l + b/(n*l) = k/l (b/(n*l)=0, because b<n)
=> left = right

Case2 assume m = kn,
left = (m/n)/l = (kn/n)/l = k/l
right = kn/(n*l) = k/l
=> left = right

So, (m/n)/l == m/(n*l)

如果 n*l 超出整数类型的范围,则不为真。 - mtrw
1
@mtrw 说实话,这是不用说的。 - Anycorn
@ziang,@aaa - 我当时下投票的时候认为溢出是问题的重要部分。现在我的投票时间太久了,无法撤回。抱歉,ziang。 - mtrw
@mtrw,完全没有问题。我们在这里学习和讨论事情,谁在乎票数 :) - zs2020
这是一个很好的答案,但case2并不是必要的,它只是Case的一个子集,其中b==0 - Mooing Duck

5

您是在谈论数学整数吗?还是编程语言中的定宽整数?

如果使用定宽整数,这两个方程在数学整数上是相同的,但两个函数的溢出行为不同。

例如,假设整数是32位的。

(1310720000/65536)/65537 = 20000/65537 = 0

然而,65536 * 65537会导致32位整数溢出,并且等于65536,因此

1310720000/(65536*65537) = 1310720000/65536 = 20000

如果你能做到,我会再加上一个+1,因为你似乎是唯一一个注意到整数这个词的回答者! - mtrw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接