要做a^b计算,相比于用循环把a连续乘b-1次,快速幂的时间复杂度要低很多,可以实现程序的时间优化和在比赛时防止超时。
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
long a=in.nextLong();
long b=in.nextLong();
long ans=1;
long base=a;
while(b>0) {
if((b&1)==1) {//最右的二进制位是1
ans*=base;
}
base*=base;
b>>=1;
}
System.out.println(ans);
}
}
用右移运算分别取得b的二进制的每一位,
比如,写作,可以通过return (1) (0) (0) (1)来计算。其中的"8、4、2、1"是遵循(n>=0)规律的。其实不一定要遵循(n>=0),只是这样的规律便于用公式实现。
这样算的目的是将“把指数的数量的所有底数相乘”这个过程变成了“把一部分多底数相乘的值和另一部分多底数相乘的值相乘”,
即4 4 4 4 4 4 4 4变成 。
另外,可以参考这个:用java学算法(一) 快速幂与大数快速幂