2012-07-20 4 views
9

Wie wird a%b mit großen Ganzzahlen verwendet? wie% Operator für BigInteger in Java

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

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

Eclipse-sagt, dass Operator% für BigInteger nicht definiert ist.

Irgendwelche Ideen?

+3

Schauen Sie sich die 'mod'-Funktion im BigInteger Javadoc an. –

Antwort

19

So:

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

Oder als Benutzer Duncan in einem Kommentar vorgeschlagen, können wir die if-Anweisung ganz wie so nehmen:

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

Wenn val% 2 == 0 ist eine gerade Zahl, nicht ungerade. –

+0

Danke, habe das Ausrufezeichen vergessen. – jrad

+0

Keine Notwendigkeit für eine if-Anweisung, nur 'return! Val.mod (new BigInteger (" 2 ")). Equals (BigInteger.ZERO);'. –

1

Verwenden Sie val.mod (2).

BigInteger ist ein Objekt. Sie können arithmetische Operatoren nicht für Objekte verwenden, die nur mit Primitiven arbeiten.

% funktioniert nur mit java.lang.Integer, weil das implizit umgewandelt wird (eigentlich heißt es unboxed) zu int. Aber BigInteger kann nicht deaktiviert werden. Unboxing/Baxing (dh die Konvertierung von Objekt zu Primitiv/von Objekt zu Objekt) funktioniert nur mit int, float, double, short und byte.

2

Eine viel effizienter ist das letzte Bit zu überprüfen. Wenn es 0 ist (aka false) ist die Zahl gerade, andernfalls ist es ungerade.

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 

Auch seine weniger Zeilen des Codes.

2

ich die Methode auf diese Weise remainder der Klasse BigInteger verwenden würde:

BigInteger result = a.remainder(b); 

Die Zuordnung auf die Tatsache zurückzuführen ist, dass BigInteger unveränderlich ist, eine wird so nicht durch das Verfahren geändert werden.