使用BigInteger绕过Integer.toString()

时间:2016-06-29 21:22:46

标签: java biginteger

我想获得一个数字的剩余四次幂。这是我的代码:

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)更简洁。是否有可能重写它以使其更清晰?

3 个答案:

答案 0 :(得分:5)

您可以使用StringBigInteger.valueOf(long)转换为int,通过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 :(得分:3)

我不知道这是否更好,但它摆脱了不必要的转换为String并返回:

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

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

答案 2 :(得分: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();
    }
}