Java 绕过Integer.toString()处理BigInteger
我想得到一个数的四次幂的余数。这是我的密码:Java 绕过Integer.toString()处理BigInteger,java,biginteger,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);
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.resident(b)
更简洁。是否可以将其重写以使其更清晰?我不知道这是否更好,但它消除了对字符串的不必要转换,并返回:
static int testMod(int a, int mod)
{
BigInteger a4 = BigInteger.valueOf(a).pow(4);
return a4.remainder(BigInteger.valueOf(mod)).intValue();
}
通过使用biginger.valueOf(long)
将int
s转换为biginger
,您可以通过String
摆脱转换。但是,不能将%
运算符应用于biginger
操作数。如果可以,则biginger.rem余数()
将不存在。另一方面,正如@LouisWasserman所观察到的,有biginger.modPow()
在一次调用中执行求幂和余数
此外,biginger
支持方法链接,正如您所认识的那样。如果你愿意的话,你可以在一个语句中完成整个过程,但我认为这是简洁性和可读性之间的一个很好的折衷:
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();
}
虽然还没有提出,但您也可以考虑使用import static
来减轻代码的负担,也可以使用biginger#mod
方法代替#余数
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();
}
}
应为“四次方”或“四次方”。由于a4可能大于一个长整数,如果将a4转换为整数以执行模运算,则可能会失去精度并返回错误答案。为什么不使用biginger.modPow
?@LouisWasserman,确实是为什么?我没有好的回应。嗯。我想你实际上可能不得不做bigA.modPow(biginger.valueOf(4),bigMod)
,这很可惜,但我怀疑还是值得的。@LouisWasserman,是的,你是对的。虽然没有那么漂亮,但是一个modPow()
比链接pow()
和rements()
要好得多。FWIW:事实上,rements()
可能仍然存在,即使存在操作符重载。我的(Delphi)BigInteger实现具有运算符重载和完整函数名。