2016-06-29 27 views
4

我想獲得數字的四次方的餘數。這裏是我的代碼:使用BigInteger繞過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(); 
} 

它工作正常,但轉換爲字符串似乎沒有必要,並使用%操作會比a.remainder(b)更簡潔。是否有可能重寫它以使其更清楚?

+0

應該是「第四」或「4」的力量。 – mbomb007

+0

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

+0

由於a4的長度可能會比較長,您可能會失去精度並返回錯誤如果您將a4轉換爲int以執行模數運算,請回答。 – user3745362

回答

5

您可以通過使用BigInteger.valueOf(long)通過String擺脫轉換將您的int s轉換爲BigInteger。但是,您不能將%運算符應用於BigInteger操作數。如果可以的話,那麼BigInteger.remainder()就不存在了。另一方面,正如@LouisWasserman所觀察到的那樣,在一次調用中有BigInteger.modPow()執行冪運算和餘數。

此外,BigInteger支持方法鏈,如您所知。你可以做整個事情在一個聲明,如果你想要的,但我認爲這是簡潔性和可讀性之間的良好折衷:

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

爲什麼不使用'BigInteger.modPow'? –

+0

@LouisWasserman,的確爲什麼不呢?我沒有很好的迴應。更新。 –

+0

嗯。我認爲你實際上可能必須做'bigA.modPow(BigInteger.valueOf(4),bigMod)',這是一個恥辱,但我懷疑它還是值得的。 –

3

我不知道這是任何好轉與否,但它擺脫了不必要的轉換來String和背部:

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

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

它沒有被提出,但你也可以考慮使用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(); 
    } 
}