使用 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)
更简洁。是否可以重写它以使其更清楚?
我不知道这是否更好,但它消除了不必要的 String
和返回:
static int testMod(int a, int mod)
{
BigInteger a4 = BigInteger.valueOf(a).pow(4);
return a4.remainder(BigInteger.valueOf(mod)).intValue();
}
您可以使用 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();
}
尚未提出,但您也可以考虑使用 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();
}
}
我想求一个数的四次方的余数。这是我的代码:
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)
更简洁。是否可以重写它以使其更清楚?
我不知道这是否更好,但它消除了不必要的 String
和返回:
static int testMod(int a, int mod)
{
BigInteger a4 = BigInteger.valueOf(a).pow(4);
return a4.remainder(BigInteger.valueOf(mod)).intValue();
}
您可以使用 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();
}
尚未提出,但您也可以考虑使用 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();
}
}