2011-10-13 16 views
6

Cuando uso el operador% en mis programas Java, sigo obteniendo respuestas negativas. Ejemplo: -1% 100 da -1. Si bien esto es matemáticamente correcto, quiero obtener la solución matemática normal, o 99. En otras palabras, quiero obtener la solución entera positiva más pequeña. ¿Hay alguna solución simple para esto en Java (tal vez algo que pasé por alto en matemáticas? ¿No puedo encontrarlo)?¿Cómo puedo manejar modificaciones no negativas?

También quiero aclarar que si hay algo en la API que hace esto, un enlace sería increíble.

+0

La solución matemáticamente correcta *** es *** la solución matemática normal. No hizo su pregunta con claridad, pero parece que quiere tomar el valor absoluto de su variable antes de modificarla. – Perception

+1

@Perception, quiere decir que quiere el resto en la división en el sentido del algoritmo de división. Es decir, quiere una solución entre 0 y 99, inclusive. La mayoría de los matemáticos (a diferencia de los informáticos) verían que esta es la noción más significativa del resto. – Hammerite

+0

Siempre lo he hecho en clases de matemáticas como la solución entera menos positiva. Pero también, -1 mod 100! = 1 mod 100. ¿Es eso lo que querías decir? – varatis

Respuesta

3

¿Puedes hacer esto?

int d = 100; 

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

Esto debería funcionar para cualquier positivo d.

+0

No, desafortunadamente. 100 no siempre será el mod. Varía. – varatis

+0

¿Necesita manejar un módulo negativo? – Mysticial

+0

No, no hay módulo negativo – varatis

2

Usted puede hacer lo siguiente

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

Esto no funciona. ¿Qué pasa si 'x = -201' y' modulo = 100'. – Mysticial

+0

Buen punto. Actualizado. –

0

Esto funciona, para cualquier valor en lugar de d o x.

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

¿Acabas de copiar mi respuesta y cambiar el formato? (EDITAR: No importa, cambió el 'si' a un' while'. Vea los comentarios en mi respuesta ...) – Mysticial

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

Por ejemplo:

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

Y

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

No hay bucles.

+0

Esto no funciona si i% n es 0 y i <0; p.ej. mod (-200, 100) == 100 en lugar de 0. –

+0

@LajosMolnar Reparado, gracias. – phs

Cuestiones relacionadas