2016-06-29 22 views
4

Ich möchte einen Rest einer vierten Potenz einer Zahl erhalten. Hier ist mein Code:Arbeiten mit BigInteger umgehen Integer.toString()

static int testMod(int a, int mod) { 

/* //This looks clear 
    BigInteger a4 = a;  
    return (a4.pow(4))%mod; 
*/ 

    //This works 
    String a2String = Integer.toString(a); 
    String mod2String = Integer.toString(mod); 
    BigInteger a4 = new BigInteger(a2String); 
    BigInteger modBigInt = new BigInteger(mod2String); 
    a4 = a4.pow(4); 

    return a4.remainder(modBigInt).intValue(); 
} 

Es funktioniert gut, aber die Umstellung auf String scheint überflüssig, und mit Hilfe der % Betreiber wäre prägnanter als a.remainder(b). Ist es möglich, es umzuschreiben, um es klarer zu machen?

+0

Sollte „vierte“ oder „4.“ Macht sein. – mbomb007

+0

https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#valueOf-long- –

+0

Da a4 größer als eine lange sein könnte, würden Sie möglicherweise die Präzision verlieren und das falsche zurückgeben antworte, wenn du a4 in ein int umwandelst, um die Modulo-Operation durchzuführen. – user3745362

Antwort

5

Sie können durch String die Umsätze durch die Verwendung loszuwerden BigInteger.valueOf(long) zu wandeln Sie Ihre int s in BigInteger um. Sie können den Operator % jedoch nicht auf Operanden BigInteger anwenden. Wenn Sie könnten, wäre BigInteger.remainder() nicht vorhanden. Auf der anderen Seite, wie @LouisWasserman beobachtet, gibt es BigInteger.modPow(), um die Exponentiation und den Rest in einem Aufruf durchzuführen.

Zusätzlich unterstützt BigInteger Methodenverkettung, wie Sie erkennen. Man könnte das Ganze in einer Aussage tun, wenn man will, aber ich denke, das ist ein guter Kompromiss zwischen Prägnanz und Lesbarkeit:

static int testMod(int a, int mod) { 
    BigInteger bigA = BigInteger.valueOf(a); 
    BigInteger bigMod = BigInteger.valueOf(mod); 

    return bigA.modPow(BigInteger.valueOf(4), bigMod).intValue(); 
} 
+1

Warum nicht 'BigInteger.modPow' verwenden? –

+0

@LouisWasserman, warum nicht? Ich habe keine gute Antwort. Aktualisiert. –

+0

Hmm. Ich denke, Sie müssen tatsächlich 'bigA.modPow (BigInteger.valueOf (4), bigMod)' tun, was eine Schande ist, aber ich denke, es lohnt sich noch. –

3

Ich weiß nicht, ob dies besser ist oder nicht, aber es wird zu String der unnötigen Umwandlung zu befreien und zurück:

static int testMod(int a, int mod) 
{ 
    BigInteger a4 = BigInteger.valueOf(a).pow(4); 

    return a4.remainder(BigInteger.valueOf(mod)).intValue(); 
} 
1

Es wird nicht vorgeschlagen worden, aber Sie können auch denken, mit den import static zu erhellen Ihr Code und auch die Methode BigInteger#mod statt #remainder

import java.math.BigInteger; 
import static java.math.BigInteger.valueOf; 


public class BigInt { 
    public static void main(String[] args) { 
     System.out.println(testMod(5,36)); // 13 
     System.out.println(testMod(250, 999)); // 160 
    } 

    public static int testMod(int a, int mod) { 
     return valueOf(a).pow(4).mod(valueOf(mod)).intValue(); 
    } 
}