快速幂运算
普通的幂运算,例如2的10次方,是按照2乘2乘2.........一直到乘以十个二,如果指数比较小,那么时间还算小,如果遇到特别大的数,时间就会显得非常巨大,所以在此介绍快速幂的方法(方法有很多,在此只介绍易懂的);
在介绍这种快幂的方法之前,需要简单介绍几个小知识点;
二进制运算符
1.(&)
用于取位操作,例如(x&1)的结果是将十进制数(x)转换成二进制数之后再取最后一位
如果x=11,转成二进制后等于1011 ,再取最后一位是1。
2.(>>=)(右移运算符)
int a = 11; a>>=1; 运行 : a = 5;
解析:将11转换成了二进制1101,将1101右移了一位变成0101,而二进制0101在 十进制中表示5
所以输出等于5
3.幂运算知识
代码实现:
public class Main2 {//动态规划
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(mi(a,b));
}
public static int mi(int a ,int b) {
int ans = 1;
int base = a;
if(b==1) {
return a;
}else {
while(b!=0) {
if((b&1)==1) {
ans = ans*base;
}
b>>=1;
base = base * base;
}
return ans;
}
}
}
在此并没有探讨大数的做法,把int型换成long或者Big,根据题意。
现在解释上面代码:
怕有些朋友不懂代码,在此带一组数据帮助理解,
如果按照从前,我肯定会2x2x2x2........ 乘(11次)
但是现在我会将指数(11)换成二进制1011(如果还不知道如何二进制跟十进制转换的同学可以自己查一下这方面的知识 ),根据二进制可以写出他的十进制的表示方法 (8421码)
11=
下方表格帮助理解:
8421码 | 8 | 4 | 2 | 1 |
二进制 | 1 | 0 | 1 | 1 |
位权 | 3 | 2 | 1 | 0 |
所以有
== = (乘3次)
分析可得原先的做法要乘11次,而快速幂只需要乘3次,由此可见快速幂的优越性与实用性!
1.代码中主要需要理解的地方
(1.)base=base*base的作用
实现 :
(2.)ans = ans*base的作用
实现:
(3.)b>>=1的作用
实现:
当b等于0000退出循环
总结
以上主要详细解释了快速幂的主要步骤还有代码实现还有其他的相关知识,如果朋友们发现错误的地方欢迎评论,大家共同进步。