學弟講算法·快速冪

一、問題提出

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 相關教程

二進制按位與,位移運算教程

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