2011-10-13 33 views
6

Gdy używam operatora% w moich programach Java, ciągle otrzymuję negatywne odpowiedzi. Przykład: -1% 100 daje -1. Chociaż jest to matematycznie poprawne, chcę uzyskać normalne rozwiązanie matematyczne lub 99. Innymi słowy, chcę uzyskać najmniejsze dodatnie całkowite rozwiązanie. Czy istnieje jakieś proste rozwiązanie tego problemu w Javie (być może coś, czego pominięto w matematyce? - nie mogę go znaleźć)?Jak radzić sobie z nieujemnymi modami?

Chcę również wyjaśnić, że jeśli jest coś w API, które to robi, link byłby niesamowity.

+0

Matematycznie poprawne rozwiązanie *** jest *** normalnym rozwiązaniem matematycznym. Nie zadałeś wyraźnie pytania, ale brzmi to tak, jakbyś chciał wziąć bezwzględną wartość swojej zmiennej przed modyfikacją. – Perception

+1

@Percepcja, ma na myśli to, że chce resztę po podziale w sensie algorytmu podziału. Oznacza to, że chce rozwiązania między 0 a 99 włącznie. Większość matematyków (w odróżnieniu od informatyków) postrzega to jako bardziej znaczące pojęcie reszty. – Hammerite

+0

Zawsze robiłem to w klasach matematycznych jako najmniej dodatnie rozwiązanie integer. Ale także, -1 mod 100! = 1 mod 100. Czy to masz na myśli? – varatis

Odpowiedz

3

Możesz to zrobić?

int d = 100; 

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

To powinno działać dla każdego pozytywnego d.

+0

Nie, niestety. 100 nie zawsze będzie mod. Różni się. – varatis

+0

Czy potrzebujesz obsługi ujemnego modułu? – Mysticial

+0

Nie, brak ujemnego modułu – varatis

2

można zrobić następujące

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

To nie działa. Co jeśli 'x = -201' i' modulo = 100'. – Mysticial

+0

Dobra uwaga. Zaktualizowano. –

0

To działa, dla jakichkolwiek wartości w miejscu d lub x.

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

Czy właśnie skopiowałeś moją odpowiedź i zmieniłeś formatowanie? (EDYCJA: Nieważne, zmieniłeś 'if' na' while'. Zobacz komentarze w mojej odpowiedzi ...) – Mysticial

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

Na przykład:

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)); 
    } 
} 

I

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

Brak pętle.

+0

To nie działa, jeśli i% n wynosi 0, i i <0; na przykład mod (-200, 100) == 100 zamiast 0. –

+0

@LajosMolnar Naprawiono, dziękuję. – phs

Powiązane problemy