体会一下快速幂:
求7的105次方
如果是使用传统方法:7*7*7*7.......要乘105次
但要是使用快速幂算法: = 7*
*
*
我们仔细观察可以发现
所以如何求:,就是将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*
*
*
,我们要找的 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;
还有超过了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);
}
}