2010-04-14 72 views
7

執行以下整數算術屬性保留嗎?整數除法屬性

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

起初我以爲我知道答案(不成立),但現在不知道。 是否適用於所有數字或僅適用於某些條件,即n > l

該問題屬於計算機算術,即q = n/m, q*m != n,忽略溢出。

+0

你關心邊緣像溢出情況?或者像「n/m」向下舍入而不是朝向零的那些奇怪的架構/語言? – 2015-04-06 18:45:18

回答

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) 
+0

如果n * l溢出整型的邊界,則爲true。 – mtrw 2010-04-14 03:15:30

+1

@mtrw要公平,不言而喻 – Anycorn 2010-04-14 03:21:22

+0

@ziang,@aaa - 我低估了這種想法,溢出是問題的重要組成部分。現在我的downvote太舊了,無法撤消。對不起。 – mtrw 2010-04-14 03:29:02

5

你說的是數學整數嗎?還是編程語言中的固定寬度整數?

這兩個公式與數學整數相同,但如果使用固定寬度整數,則兩個函數具有不同的溢出行爲。

例如,假設整數是32位

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

然而,65536 * 65537將溢出32位整數,將等於65536,所以

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

+1打我。如果我可以的話,另一個+1顯然是唯一的應答者來抓住整數! – mtrw 2010-04-14 03:14:45