2012-07-20 17 views
9

¿Cómo usar a%b con enteros grandes? como% operador para BigInteger en java

... 
BigInteger val = new BigInteger("1254789363254125"); 
... 

boolean odd(val){ 
    if(val%2!=0) 
     return true; 
    return false; 
... 

Eclipse dice que el operador% no está definida para BigInteger.

¿Alguna idea?

+3

Eche un vistazo a la función 'mod' en el BigInteger javadoc. –

Respuesta

19

De esta manera:

BigInteger val = new BigInteger("1254789363254125"); 
public boolean odd(BigInteger val) { 
    if(!val.mod(new BigInteger("2")).equals(BigInteger.ZERO)) 
     return true; 
    return false; 
} 

O como usuario Duncan sugirió en un comentario, podemos sacar la sentencia if por completo, así:

BigInteger val = new BigInteger("1254789363254125"); 
public boolean odd(BigInteger val) { 
    return !val.mod(new BigInteger("2")).equals(BigInteger.ZERO)); 
} 
+0

Si val% 2 == 0 es un número par, no es impar. –

+0

Gracias, olvidé el signo de exclamación. – jrad

+0

No es necesario un enunciado if, simplemente 'return! Val.mod (nuevo BigInteger (" 2 ")). Equals (BigInteger.ZERO);'. –

1

Use val.mod (2).

BigInteger es un objeto. No puede usar operadores aritméticos en objetos, que solo funciona con primitivas.

% solo funciona con java.lang.Integer porque está implícitamente lanzado (en realidad, se llama unboxed) a int. Pero BigInteger no se puede desempaquetar. unboxing/baxing (que significa objeto para conversión de primitiva/primitiva a objeto) solo funciona con int, float, double, short y byte.

2

una forma mucho más eficiente manera es verificar el último bit. Si es 0 (también conocido como false) el número es par, de lo contrario es impar.

public boolean odd(BigInteger i){ 
    return i.testBit(0); 
} 

odd(BigInteger.valueOf(1));//true 
odd(BigInteger.valueOf(2));//false 
odd(BigInteger.valueOf(101));//true 
odd(BigInteger.valueOf(100));//false 

También hay menos líneas de código.

2

me gustaría usar el método de la clase remainder BigInteger de esta manera:

BigInteger result = a.remainder(b); 

La asignación se debe al hecho de que BigInteger es inmutable, por lo que una no se cambiará por el método.