java,快速幂算法

体会一下快速幂:

求7的105次方

如果是使用传统方法:7*7*7*7.......要乘105次

但要是使用快速幂算法:7^{105} = 7*7^{8}*7^{32}*7^{64}

我们仔细观察可以发现

所以如何求:7^{105},就是将105转为二进制,再去找其中为的1的位置,其余补0的数

转化为幂的相加

代码思路;

解析:蓝色部分:每次循环都是对n/2并向下取整,这相当于将105的二进制不断的右移

红色部分:a的初始化a = 7 ,通过a = a*a的不断循环得到7的幂次

0000 001 ->1

0000 010 ->2

0000 100 ->4

0001 000 ->8

0010 000 ->16

0100 000 ->32

1000 000 ->64

不难发现7^{105} = 7*7^{8}*7^{32}*7^{64},我们要找的 1 8 32 64,就在上面的数中

接下来就是筛选我们要的数:

0000 001 ->1

0001 000 ->8

0100 000 ->32

1000 000 ->64

黄色部分:if n mod 2 ==1{:表示对n不断右移中,二进制末尾是1

r = r*a;//将我们要找的数累乘

}

最后 return r

注:在java中(int)类型的整数相除,a/b >0时

相当于相除之后,再将商向下取整,a/b <0时,向下取整

如:int a = 37;int b = 10;

sout(a/b)//结果为3

所以对n/2,并向下取整,直接写成: n = n/2;

还有7^{105}超过了int的范围,打印r可能是个负数

public class Test1 {
    public static void main(String[] args) {
        //求7的105次方
        int n = 105;
        int a = 7;
        int r = 1;
        while(n!=0){
            if(n%2 == 1){
                //得到105转为2进制后,取其中为1的位置,其余位置补0的数
                r = r*a;
            }
            a = a*a;//得到105转为二进制后,每一个(有一位为1,其余都为0)的数,再作为7的幂
            n = n/2;///n/2,并向下取模
        }
        System.out.println(r);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值