2011-10-13 18 views
6

當我在我的Java程序中使用運算符%時,我不斷收到負面答案。例如:-1%100給出-1。雖然這在數學上是正確的,但我想得到正常的數學解或99.換句話說,我想得到最小的正整數解。在Java中有沒有簡單的解決方案(可能是我在數學中忽略的東西? - 我無法找到它)?我該如何處理非負面的mods?

我也想澄清一下,如果API中有什麼東西可以做到這一點,那麼鏈接就會很棒。

+0

數學上正確的解決方案***是***正常的數學解決方案。你沒有清楚地問你的問題,但聽起來你想在變形之前取得變量的絕對值。 – Perception

+1

@Perception,他意味着他想要在除法算法的意義上劃分餘數。也就是說,他想要一個介於0到99之間的解決方案。大多數數學家(與計算機科學家不同)認爲這是剩餘的更有意義的概念。 – Hammerite

+0

作爲最不積極的整數解決方案,我一直把它作爲數學課。而且,-1 mod 100!= 1 mod 100.這就是你的意思? – varatis

回答

3

你可以這樣做嗎?

int d = 100; 

int x = -1 % d; 
if (x < 0) 
    x += d; 

這應該適用於任何積極的d

+0

不幸的是, 100並不總是這個mod。它有所不同。 – varatis

+0

你需要處理負模量嗎? – Mysticial

+0

否,無負模數 – varatis

2

你可以做以下

int myMod(int x, int modulo) 
{ 
    return ((x % modulo) + modulo) % modulo 
} 
+0

這不起作用。如果'x = -201'和'modulo = 100'會怎麼樣。 – Mysticial

+0

好點。更新。 –

0

這工作,對任何值代替d或x。

int d=100; 
int x=-1%d; 
while (x<0) 
    x+=d; 
+0

你剛剛複製我的答案並更改格式? (編輯:沒關係,你把'if'改成了'while'。請參閱我的回答中的評論...) – Mysticial

0
i < 0 ? n - ((-i - 1) % n + 1) : i % n 

例如:

class Mod { 
    public static int mod(int i, int n) { 
    return i < 0 ? n - ((-i - 1) % n + 1) : i % n; 
    } 

    public static void main(String [] args) { 
    System.out.println("mod(-201, 100) == " + mod(-201, 100)); 
    System.out.println("mod(-200, 100) == " + mod(-200, 100)); 
    System.out.println("mod(17, 100) == " + mod(17, 100)); 
    System.out.println("mod(100, 100) == " + mod(100, 100)); 
    } 
} 

而且

$ javac Mod.java && java Mod 
mod(-201, 100) == 99 
mod(-200, 100) == 0 
mod(17, 100) == 17 
mod(100, 100) == 0 

沒有循環。

+0

如果i%n爲0且i <0,則這不起作用;例如mod(-200,100)== 100而不是0. –

+0

@LajosMolnar固定,謝謝。 – phs