使用BigInteger绕过Integer.toString()

4
我想要得到一个数字的四次方的余数。这是我的代码:
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)更加简洁。有没有可能重写它,使其更加清晰明了?


应该是“四次方”或者“4次方”。 - mbomb007
https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#valueOf-long- - JB Nizet
由于a4可能比long更大,如果您将a4转换为int执行模运算,则可能会丢失精度并返回错误的答案。 - user3745362
3个回答

5
你可以通过使用BigInteger.valueOf(long)将你的int转换为BigInteger来避免使用String进行转换。然而,你不能对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 - Louis Wasserman
@LouisWasserman,为什么不呢?我没有好的回应。已更新。 - John Bollinger
嗯,我认为你实际上可能需要执行 bigA.modPow(BigInteger.valueOf(4), bigMod),这很遗憾,但我认为仍然值得。 - Louis Wasserman
@LouisWasserman,是的,你是对的。虽然不太漂亮,但一个modPow()比链接pow()remainder()要好得多。 - John Bollinger
顺便说一句:实际上,即使有运算符重载,remainder()仍然可以存在。我的(Delphi)BigInteger实现具有运算符重载以及完整的函数名称。 - Rudy Velthuis
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接