快速幂及其简单应用

快速幂

什么是快速幂呢,举个例子。

2的16次方。

我们当然可以乘16次2,但是不够快,可能会被时间卡住。

需要换种方式思考——

2的16次方

不就是4的8次方

不也是16的4次方

不还是256的2次方么?

——大体思路就如上所示。




再思考下相关细节——

如果改成2的17次方了,多出来个2,有点不好处理。

看来仅靠初始的那一个变量不断自我平方得出答案有点困难,再设个专门记结果的变量记结果吧。

试试让初始变量保持过去的策略,每次多出来点什么就先让记结果的变量先记上。等到最后那个初始变量膨胀到指数为1的时候再乘到结果变量上

17次方只是16+1,我们换个麻烦点的例子,2的15次方

第一回合:
15为奇数,先-1为14,同时记到结果变量的头上——
初始变量:2的14次方                        结果变量:1*2=2

第二回合:
初始变量膨胀一次——
初始变量:4的7次方                          结果变量:2

第三回合:
7为奇数,先-1为6,同时记到结果变量头上——
初始变量:4的6次方                          结果变量:2*4=8

第四回合:
初始变量膨胀一次——
初始变量:16的3次方                        结果变量:8

第五回合:
记一次结果——
初始变量:16的2次方                       结果变量:8*16=128

第六回合:
初始变量膨胀一次——
初始变量:256的一次方                   结果变量:128

第七回合:
由于已经是一次方了,初始变量膨胀到最大,直接乘到结果出数,即128*256为最终结果。



最后奉上鄙人不成器的代码,如果能尽绵薄之力则不胜欣喜。

int fast_pow(int n,int m)		//n的m次方 
{
	long long int key = 1;		//考虑到可能出现的计数次幂而出现的专门记答案的变量 
	
	while(m > 1)
	{
		
		if(m % 2 == 1)		//当然了这句可以改成和1取与 
		{
			m--;			//当然了这句写不写都一样,反正最后/2了也会把这个多出来的部分削去
			key* = n;
		}
		
		n *= n;
		m /= 2;//这句通常都写成位运算右移一位,形如m>>1,不光是因为二者一个效果,靠位运算来理解的话自有另一套理解方式,不过那样的理解方式有点容易吓跑没(像)耐(我)心(这)看(种)的新手。
	}
	key *= n;
	return key;
} 



矩阵幂改天再补吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值