開(kāi)發(fā)一套網(wǎng)站價(jià)格株洲seo排名
前言
冪運(yùn)算為常見(jiàn)的數(shù)學(xué)運(yùn)算,形式為 a b a^b ab ,其中a
為底數(shù),b
為指數(shù),
力扣中,冪運(yùn)算相關(guān)的問(wèn)題主要是判斷一個(gè)數(shù)是不是特定正整數(shù)的整數(shù)次冪,以及快速冪的處理。
1.求2的冪
力扣231題,給你一個(gè)整數(shù) n,請(qǐng)你判斷該整數(shù)是否是 2 的冪次方。如果是,返回 true
;否則,返回 false
。
分析:第一種方法是我們可以用通過(guò)逐漸縮小n值來(lái)判斷是否是2的冪次方,只需要循環(huán)用除的方法就可以了,還需要判斷一下n是否是正整數(shù),如果不是就直接返回false。第二種方法是位運(yùn)算,如果n是2的冪次方,那么n的二進(jìn)制表示就只有一個(gè)1,如果存在非負(fù)整數(shù) k 使得 n = 2 k n=2^k n=2k,則 n 的二進(jìn)制表示為 1 后面跟 k 個(gè)0,比如n=4
,其二進(jìn)制表示為 ( 0100 ) 2 (0100)_2 (0100)2?,n-1
也就是3的二進(jìn)制表示則為 ( 0011 ) 2 (0011)_2 (0011)2? ,使用位運(yùn)算n & (n - 1)
如果結(jié)果為0就說(shuō)明n是2的冪次方,否則不是。
代碼如下:
/*** 采用除法* @param n {number}* @return {boolean}* */
function isPowerOfTwo(n) {if (n <= 0) {return false;}// 這里2可以替換為任意正整數(shù)m,就是計(jì)算m的冪次方while (n % 2 === 0) {n = parseInt(n / 2);}if (n === 1) {return true;} else {return false;}
}/*** 采用位運(yùn)算* @param n {number}* @return {boolean}* */function isPowerOfTwo(n) {if (n <= 0) {return false;}// 如果存在非負(fù)整數(shù) k 使得 n=2^k,則 n 的二進(jìn)制表示為 1 后面跟 k 個(gè)0return n & (n - 1) === 0;
}
拓展知識(shí):采用循環(huán)除法的方法中,2可以替換為任意正整數(shù)m,就是計(jì)算m的冪次方。
2.求3的冪
力扣326題, 給定一個(gè)整數(shù),寫(xiě)一個(gè)函數(shù)來(lái)判斷它是否是 3 的冪次方。如果是,返回 true ;否則,返回 false 。整數(shù) n 是 3 的冪次方需滿足:存在整數(shù) x 使得 n = = 3 x n == 3^x n==3x
分析:用除法思路與上題一樣。這里說(shuō)一下還可以用位運(yùn)算的解決辦法。我們知道 3 0 = 1 , 3 1 = 3 , 3 2 = 9 , . . . , 3 19 = 1162261467 3^0=1,3^1=3,3^2=9,...,3^{19}=1162261467 30=1,31=3,32=9,...,319=1162261467 ,在最大正整數(shù)范圍之內(nèi),如果是3的冪就一定是1162261467
的除數(shù)。
代碼如下:
function isPowerOfThree(n) {if (n <= 0) {return false;}// 2^31 - 1內(nèi)最大的3的冪為3^19=1162261467,只要n為1162261647的除數(shù)就說(shuō)明是3的冪次方return (1162261467 % n) === 0;
}
3.求4的冪
力扣342 題,給定一個(gè)整數(shù),寫(xiě)一個(gè)函數(shù)來(lái)判斷它是否是 4 的冪次方。如果是,返回 true ;否則,返回 false 。整數(shù) n 是 4 的冪次方需滿足:存在整數(shù) x 使得 n = = 4 x n == 4^x n==4x 。
分析:第一種方法還是可以用循環(huán)除法。第二種方法就是位運(yùn)算,這種方法可以在求2的冪的位運(yùn)算解法進(jìn)一步得出, 4 k 4^k 4k其實(shí)就是 2 2 k 2^{2k} 22k ,2的偶數(shù)次冪,判斷二進(jìn)制表示中1的位置是否出現(xiàn)在從低位開(kāi)始的第偶數(shù)位上即可,這里規(guī)定最低位為第0位。比如n=16
,其二進(jìn)制表示為 ( 00010000 ) 2 (00010000)_2 (00010000)2?,1的位置為第4位。創(chuàng)建一個(gè)32位有符號(hào)整數(shù) ( 10101010101010101010101010101010 ) 2 (10101010101010101010101010101010)_2 (10101010101010101010101010101010)2?,讓其偶數(shù)為0,奇數(shù)位為1,與n進(jìn)行位與運(yùn)算,如果結(jié)果為0,說(shuō)明n為4的冪次方數(shù),否則不是。為了使代碼更簡(jiǎn)潔,還可以將創(chuàng)建的32位有符號(hào)整數(shù)用16進(jìn)制表示,即 ( a a a a a a a a ) 16 (aaaaaaaa)_{16} (aaaaaaaa)16? , 也就是0xaaaaaaaa
代碼如下:
function isPowerOfFour(n) {if (n <= 0) {return false;}return (n & (n - 1)) === 0 && (n & 0xaaaaaaaa) === 0;
}