学弟讲算法·快速幂

一、问题提出

3133^{13}

二、问题研究

2.1 常规算法

3133^{13} = 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3
需要算14次,太麻烦,不符合程序员的逼格

2.2 快速幂

(13)10(13)_{10} = (1101)2(1101)_2 = 1 * 232^3 + 1 * 222^2 + 0 * 212^1 + 1 * 202^0

3133^{13} = 3123+122+021+1203^{1 * 2^3 +1 * 2^2 + 0 * 2^1 + 1 * 2^0 }

3133^{13} = 383^8 * 343^4 * 313^1

需要算7次,方便运算

推导过程
313^1 = (31)(3^1)

323^2 = (31)2(3^1)^2

343^4 = (32)2(3^2)^2

383^8 = (34)2(3^4)^2

快速幂就是运算过程不断对底数进行平方运算,并当指数的二进制某位为 1 时,保存当前底数的值

2.3 代码实现

代码实现

typedef long long ll;
//a为底数,b为指数
ll fastPower(int a,int b) {
	if(b==0) {
		return 1;
	}
	//res用来保存结果
	ll res = 1;
	while(b) {
		//指数当前位为1时,保存底数的值
		if(b&1) {
			res*=a;
		}
		//判断指数的下一位
		b>>=1;
		//底数做平方运算
		a*=a;
	}
	return res;

}

运行结果:
在这里插入图片描述

b&1 表示b与1进行按位与操作,若b当前二进制位为1则结果为1;同时若b为奇数时,该操作结果也为1

>> 表示位移运算

2.4 相关教程

二进制按位与,位移运算教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章