快速幂运算详解加解析(新人秒懂)

                                           快速幂运算


          普通的幂运算,例如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,根据题意。

现在解释上面代码:

怕有些朋友不懂代码,在此带一组数据帮助理解,^{^{}}^{_{}}^{2^{11}}{\color{Red} }

如果按照从前,我肯定会2x2x2x2........          乘(11次)

 

但是现在我会将指数(11)换成二进制1011(如果还不知道如何二进制跟十进制转换的同学可以自己查一下这方面的知识 ),根据二进制可以写出他的十进制的表示方法 (8421码

11=2^{3}*1+2^{2}*0+2^{1}*1+2^{0}*1   

下方表格帮助理解:

8421码84 2 1
二进制1011
位权3210
 2^{3}*12^{2}*02^{1}*12^{0}*1

              

所以有

2^{11}=2^{2^{3}*1+2^{2}*0+2^{1}*1+2^{0}*1}=2^{8+2+1} =2^{8}*2^{2}*2^{1}                 (乘3次)

分析可得原先的做法要乘11次,而快速幂只需要乘3次,由此可见快速幂的优越性与实用性!

 

1.代码中主要需要理解的地方

(1.)base=base*base的作用

实现 : base\rightarrow base^{2}\rightarrow base^{4}\rightarrow base^{8}

(2.)ans = ans*base的作用

实现: 2^{8}*2^{2}*2^{1}

(3.)b>>=1的作用

实现: 1011\rightarrow 0101\rightarrow 0010\rightarrow0001\rightarrow 0000

当b等于0000退出循环


                                                 总结

以上主要详细解释了快速幂的主要步骤还有代码实现还有其他的相关知识,如果朋友们发现错误的地方欢迎评论,大家共同进步。

 

 

 

 

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值