算法——快速幂

4 篇文章 1 订阅

在这里插入图片描述
求一下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;
    }
}

输出:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值