簡體   English   中英

使用BigInteger繞過Integer.toString()

[英]Working with BigInteger bypassing 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();
}

它工作正常,但轉換為String似乎是不必要的,使用%運算符將比a.remainder(b)更簡潔。 是否可以重寫它以使其更清晰?

您可以通過使用BigInteger.valueOf(long)int轉換為BigInteger來消除通過String的轉換。 但是,您不能將%運算符應用於BigInteger操作數。 如果可以,那么BigInteger.remainder()將不存在。 另一方面,正如@LouisWasserman所觀察到的那樣,有一個BigInteger.modPow()來執行一次調用中的取冪和余數。

此外,正如您BigIntegerBigInteger支持方法鏈接。 如果你願意的話,你可以在一個聲明中完成整個過程,但我認為這是簡潔和可讀性之間的良好折衷:

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

我不知道這是否更好,但它擺脫了不必要的轉換為String並返回:

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

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

它還沒有被提出,但您也可以考慮使用import static來減輕代碼,還可以使用BigInteger#mod代替#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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM