Bay*_*och 37
最佳算法基于a ^ b的递归功率定义.
long pow (long a, int b)
{
if ( b == 0) return 1;
if ( b == 1) return a;
if (isEven( b )) return pow ( a * a, b/2); //even a=(a^2)^b/2
else return a * pow ( a * a, b/2); //odd a=a*(a^2)^b/2
}
Run Code Online (Sandbox Code Playgroud)
操作的运行时间是O(logb).参考:更多信息
JB *_*zet 36
整数只有32位.这意味着它的最大值是2^31 -1
.如您所见,对于非常小的数字,您很快就会得到一个无法用整数表示的结果.这就是Math.pow
使用的原因double
.
如果要任意整数精度,请使用BigInteger.pow
.但它当然效率低下.
Pet*_*hev 28
不,没有那么短的东西 a**b
这是一个简单的循环,如果你想避免双打:
long result = 1;
for (int i = 1; i <= b; i++) {
result *= a;
}
Run Code Online (Sandbox Code Playgroud)
如果要使用pow
并将结果转换为整数,请按如下方式转换结果:
int result = (int)Math.pow(a, b);
Run Code Online (Sandbox Code Playgroud)
Sta*_*ski 13
当它的力量为2时.请记住,你可以使用简单快速的移位表达 1 << exponent
例:
2 2 = 1 << 2
= (int) Math.pow(2, 2)
2 10 = 1 << 10
=(int) Math.pow(2, 10)
对于较大的指数(超过31),请使用long
2 32 = 1L << 32
=(long) Math.pow(2, 32)
顺便说一句.在Kotlin你shl
不是<<
这样的
(java)1L << 32
= 1L shl 32
(kotlin)