2011-09-20 48 views

回答

6

兩個答案(25和-1)都是有效的。只是不同的系統有不同的約定。

一個我看到的最常見的(數學)是:

quotient = floor(x/y) 
remainder = x - quotient * y 

哪裏floor()是圓接近負無窮大。

這是你的計算器給你的約定。 (數學也採用了這種約定)

一個我想大多數編程語言的使用方法是:

quotient = integerpart(x/y) 
remainder = x - quotient * y 

哪裏integerpart()是相同的(浮動 - > integer)強制轉換。 (向零舍入)

一些約定將其餘操作數保持爲相同的符號。

同樣的事情適用於分隔符的符號。不同的約定是不同的。

5

「怎麼了......?」

模運算有兩種常見的定義。 Java選擇了一個(「同一符號作爲分紅」),計算器實現了另一個;大概「和除數相同的符號」,儘管你需要做一些實驗才能確定。

實際上,modulo operation上的Wikipedia頁面給出了不同編程語言使用的運算符的4種不同定義。 (並且一些編程語言爲您提供了兩種不同語義的操作符。)

在C的情況下,定義取決於您所討論的C標準的版本。對於ISO C 1999,模運算符遵循與Java相同的定義。對於早期版本的C標準的%語義是實現相關

「這兩者之間有區別嗎?」

顯然有!

「我需要一個像計算器一樣解決它的程序。」

隨意寫一個:-)。

但如果你只是想知道如何獲得「相同的符號除數」在Java中模的形式,這裏有一個方法:

int otherModulus = (a % b) + (a < 0 ? b : 0); // works for b > 0. 

int otherModulus = (a % b) +     // works for b != 0 
        (b > 0 ? (a < 0 ? b : 0) : (a > 0 ? -b : 0)); 
+1

你確定你最後的配方?如果a和b是負數,它會給出一些低於b的值。 –

+0

@PaŭloEbermann - 很好的捕獲。我現在知道了嗎? –

3

模運算負的操作數是不同的語言不同,取決於驅動的語言定義。在Java中,Modulus更像是剩餘部分。和

int r = x % n; 
if (r > 0 && x < 0) 
{ 
    r -= n; 
} 

或者,如果你使用的是一個負輸入返回負數語言,你會:

一般來說,如果你想獲得的負輸入負數,那麼你可以使用這個喜歡正面:

int r = x % n; 
if (r < 0) 
{ 
    r += n; 
} 

所以,根據你的需要爲所期望的結果,我推薦你使用相應的執行,而不是依靠語言來計算你。

此外,請注意,結果應該在Java的情況下在JLS: in the section 15.17.3 - 剩餘操作符%中進行了自動描述。他們在那裏給出了一個動機(a%b應該是這樣(a/b)* b +(a%b)等於a),但是在JLS中包含該部分使得結果如此。

相關問題