題目描述:
冪函數的實現
算法分析:
//非負整數計算冪函數2^n
//O(n) = O(2^r),r爲輸入指數n二進制位數,即比特位數
__int64 power1(int n)
{
__int64 rnt = 1;//O(1)
for (int i = 0; i < n; i++ )//O(n)
{
rnt <<= 1; //rnt *= 2;倍增,//O(1)
}
return rnt;//O(1)
}
通用的一個算法,可以計算a^n
//a^n算法:n >= 0
__int64 powerBF( __int64 a, int n )
{
__int64 rnt = 1;
while ( 0 < n ) { //O(n)
rnt *= a;
n--;
}
return rnt;
}
算法優化:
/******************************************************************************************
* Data Structures in C++
* Auther : luxiang
* github:https://github.com/Lxxing?tab=repositories
* 歡迎交流指正
******************************************************************************************/
//優化迭代版
__int64 power1OP ( int n )
{
__int64 rnt = 1;
__int64 p = 2;
while ( 0 < n )
{
if ( n & 1 ) //如果是奇數
rnt *= p;
n >>= 1; //
p *= p;
}
return rnt;
} //O(logn) = O(r),r爲輸入指數n的比特位數
通用版本
/******************************************************************************************
* Data Structures in C++
* Auther : luxiang
* github:https://github.com/Lxxing?tab=repositories
* 歡迎交流指正
******************************************************************************************/
//優化
__int64 power( __int64 a, int n )
{
__int64 rnt = 1;
__int64 p = a;
while ( 0 < n )//O(logn)
{
if ( n & 1 )
rnt *= p;
n >>= 1;
p *= p;
}
return rnt;
}
判斷一個數是不是二的倍數,即判斷該數二進制末位是不是0:
a % 2 == 0 或者a & 0x0001 == 0。