2011-10-13 10 views
6

Quando uso l'operatore% nei miei programmi Java, continuo a ricevere risposte negative. Esempio: -1% 100 dà -1. Mentre questo è matematicamente corretto, voglio ottenere la normale soluzione matematica, o 99. In altre parole, voglio ottenere la più piccola soluzione positiva intera. C'è una soluzione semplice per questo in Java (forse qualcosa che ho trascurato in Math? - Non riesco a trovarlo)?Come posso gestire le mod non negative?

Voglio anche chiarire che se c'è qualcosa nell'API che fa questo, un collegamento sarebbe fantastico.

+0

La soluzione matematicamente corretta *** è la normale soluzione matematica. Non hai fatto la tua domanda in modo chiaro, ma sembra che tu voglia prendere il valore assoluto della tua variabile prima di modificarla. – Perception

+1

@Perception, intende che desidera il resto su divisione nel senso dell'algoritmo di divisione. Cioè, vuole una soluzione tra 0 e 99, inclusi. La maggior parte dei matematici (come distinti dagli informatici) vedrebbe questa come la nozione più significativa di resto. – Hammerite

+0

L'ho sempre fatto in classi matematiche come la soluzione intera meno positiva. Ma anche, -1 mod 100! = 1 mod 100. È questo che intendevi? – varatis

risposta

3

Si può semplicemente fare questo?

int d = 100; 

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

Questo dovrebbe funzionare per qualsiasi positiva d.

+0

No, sfortunatamente. 100 non sarà sempre il mod. Varia. – varatis

+0

Hai bisogno di gestire un modulo negativo? – Mysticial

+0

No, nessun modulo negativo – varatis

2

È possibile effettuare le seguenti

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

Questo non funziona. Cosa succede se 'x = -201' e' modulo = 100'. – Mysticial

+0

Buon punto. Aggiornato. –

0

Questo funziona, per tutti i valori al posto di d o x.

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

Hai appena copiato la mia risposta e modificato la formattazione? (EDIT: Nevermind, hai cambiato 'if' in un' while'. Vedi i commenti sulla mia risposta ...) – Mysticial

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

Ad esempio:

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

E

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

Nessun loop.

+0

Questo non funziona se i% n è 0 e i <0; per esempio. mod (-200, 100) == 100 anziché 0. –

+0

@LajosMolnar Risolto, grazie. – phs