2016-03-17 9 views
5

Quando si verifica un BigIntegera per divisibilità di qualche BigIntegerb, è possibile scrivere a.mod(b).equals(BigInteger.ZERO) o a.remainder(b).equals(BigInteger.ZERO).Devo usare mod o resto quando controllo un BigInteger per la divisibilità?

Quale delle due espressioni è più efficiente?

MODIFICA: Diverse persone hanno correttamente rilevato che mod non accetta un modulo negativo. Supponiamo che b sia positivo nella risposta.

+1

Utilizzare 'remainder' se si desidera controllare che sia diverso da zero. 'mod' fa' remainder' con un piccolo calcolo in più. – khelwood

+2

Un dettaglio di implementazione - L'implementazione di OpenJDK di 'mod()' chiama 'remainder()' sotto il cofano. –

risposta

0

Si comportano diversamente se b è negativo. Usa qualsiasi operazione tu intenda usare.

3

Guardando le javadocs ..

Per Mod (BigInteger m):

Restituisce un BigInteger il cui valore è (this mod m). Questo metodo differisce dal resto in quanto restituisce sempre un valore non negativo BigInteger.

+0

In che modo risponde alla domanda quale delle due operazioni è più efficiente? – sjakobi

+0

Nota anche che non mi interessa se il risultato è positivo o negativo - voglio solo sapere se è "0" o no. – sjakobi

5

La differenza tra questi metodi è documentata in Javadoc. Da mod(m):

Questo metodo differisce dalla remainder in quanto restituisce sempre un BigInteger non negativo.

Inoltre, questo metodo genera uno ArithmeticException se l'argomento specificato è negativo, che, come per la modifica, non è il tuo caso. Come tale, per verificare la divisibilità, non ci sarà differenza tra mod e remainder: quando uno di questi è 0 l'altro sarà pari a 0. Potresti semplicemente usare remainder dato che mod può fare un altro calcolo che non ti serve.


Per vedere la differenza in azione, considerare quanto segue:

public static void main(String[] args) { 
    BigInteger a = BigInteger.valueOf(-2); 
    BigInteger b = BigInteger.valueOf(3); 
    System.out.println(a.remainder(b)); // prints -2 
    System.out.println(a.mod(b)); // prints 1 == -2 (i.e. the remainder) + 3 
} 

Questo è in realtà la stessa differenza di primitivo inta e b e calcolando a % b (che si comporta come remainder) e Math.floorMod(a, b) (che si comporta come mod).

+0

Grazie per aver sottolineato che 'mod' non accetterà i moduli' <= 0'! – sjakobi