求一下2的100000000次方
package _数学问题;
public class _7快速幂运算详解 {
public static void main(String[] args) {
long now1=System.currentTimeMillis();
//求一下2的100000000次方
System.out.println(normalPower1(2,1000000000));
System.out.println("解法1耗时:"+(System.currentTimeMillis()-now1)+"ms");
long now2=System.currentTimeMillis();
System.out.println(normalPower2(2,1000000000));
System.out.println("解法2耗时:"+(System.currentTimeMillis()-now2)+"ms");
long now3=System.currentTimeMillis();
System.out.println(normalPower3(2,1000000000));
System.out.println("解法3耗时:"+(System.currentTimeMillis()-now3)+"ms");
long now4=System.currentTimeMillis();
System.out.println(normalPower4(2,1000000000));
System.out.println("解法4耗时:"+(System.currentTimeMillis()-now4)+"ms");
long now5=System.currentTimeMillis();
System.out.println(normalPower5(2,1000000000));
System.out.println("解法5耗时:"+(System.currentTimeMillis()-now5)+"ms");
}
//1.普通解法
public static long normalPower1(long base,long power){
long result=1;
for(int i=1;i<=power;i++){
result=result*base;
}
return result%1000;
}
//2.提前取模
public static long normalPower2(long base,long power){
long result=1;
for(int i=1;i<=power;i++){
result=result*base;
result=result%1000;
}
return result%1000;
}
//3.快速幂解法
public static long normalPower3(long base,long power){
long result=1;
while(power>0){
if (power % 2 == 0) {
//1.如果指数是偶数
power = power/2;
base=base*base%1000;
}else{
//2.如果指数是奇数
power =power-1;
result = result*base%1000;
power=power/2;
base=base*base%1000;
}
}
return result;
}
//3.快速幂解法优化
//4/2与5/2的整数部分是一样的
public static long normalPower4(long base,long power){
long result=1;
while(power>0){
if(power%2==1){
result=result*base%1000;
}
power=power/2;
base=base*base%1000;
}
return result;
}
//4.快速幂终极优化
//二进制奇数与1做与运算,最后一位一定是1
//二进制偶数数与1做与运算,最后一位一定是0
public static long normalPower5(long base,long power){
long result=1;
while(power>0){
if((power&1)!=0){//这里等价于power%2==1
result=result*base%1000;
}
power>>=1;//这里等价于power=power/2;
base=(base*base)%1000;
}
return result;
}
}
输出: