題記:
給定一個整數(shù),寫一個函數(shù)來判斷它是否是 3 的冪次方。如果是,返回 true ;否則,返回 false 。
整數(shù) n 是 3 的冪次方需滿足:存在整數(shù) x 使得 n == 3^x
示例 1:
輸入:n = 27
輸出:true
示例 2:
輸入:n = 0
輸出:false
示例 3:
輸入:n = 9
輸出:true
示例 4:
輸入:n = 45
輸出:false
提示:
-2 ^ 31 <= n <= 2 ^ 31 - 1
進(jìn)階:你能不使用循環(huán)或者遞歸來完成本題嗎?
題目來源:
作者:LeetCode
鏈接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnsdi2/
來源:力扣(LeetCode)
解題方法:
自己敲的:
一:循環(huán),一直乘以3,判斷是否有等于該整數(shù)的數(shù)存在
function isPowerOfThree($n) {
//循環(huán)
if($n == 3 || $n == 1)
return true;
$start = 3;
while($start && $start <= $n){
$start = $start * 3;
if($start == $n){
return true;
}
}
return false;
}
二:遞歸,一直除以3
function isPowerOfThree($n) {
//遞歸
if($n == 1)
return true;
if($n > 0 && $n % 3 == 0 && $this->isPowerOfThree($n / 3))
return true;
return false;
}
官方方法:(其實也就是一直乘以3)
function isPowerOfThree($n) {
$flag = true;
$num = 0;
while($flag){
$x = pow(3,$num); //3的num次方
$num++;
if($x > $n){
$flag = false;
return false;
}
if($x == $n){
$flag = false;
return true;
}
}
}
其他方法:
一:一直除以3
一種最簡單的方式就是判斷n是否能夠被3整除,如果能夠被3整除就除以3,直到不能被3整除為止,最后判斷n是否等于1,代碼比較簡單,來看下
public boolean isPowerOfThree(int n) {
if (n > 1)
while (n % 3 == 0)
n /= 3;
return n == 1;
}
轉(zhuǎn)換為PHP代碼為:
function isPowerOfThree($n) {
//一直除以3
if($n > 1){
while($n % 3 == 0){
$n /= 3;
}
}
return $n == 1;
}
二:遞歸方式解決(同上面的遞歸方法,只是簡化了寫法)
還可以改為遞歸的方式,一行代碼解決
public boolean isPowerOfThree(int n) {
return n > 0 && (n == 1 || (n % 3 == 0 && isPowerOfThree(n / 3)));
}
轉(zhuǎn)換為PHP代碼為:
function isPowerOfThree($n) {
return $n > 0 && ($n == 1 || ($n % 3 == 0 && $this->isPowerOfThree($n / 3)));
}
三:算術(shù)表達(dá)式計算
先來普及一波數(shù)學(xué)知識
對數(shù)的乘法法則: log(ab) = log(a) + log(b)
對數(shù)的乘法法則表明,兩個數(shù)相乘的對數(shù)等于這兩個數(shù)分別對數(shù)后的和。例如,log(10100) = log(10) + log(100) = 1 + 2 = 3。對數(shù)的除法法則: log(a/b) = log(a) - log(b)
對數(shù)的除法法則表明,兩個數(shù)相除的對數(shù)等于這兩個數(shù)分別對數(shù)后的差。例如,log(100/10) = log(100) - log(10) =
2 - 1 = 1。對數(shù)的冪法法則: log(a^b) = blog(a)
對數(shù)的冪法法則表明,一個數(shù)的冪的對數(shù)等于這個數(shù)的對數(shù)乘以冪的指數(shù)。例如,log(10^3) = 3log(10) = 3*1 = 3。對數(shù)的換底公式: loga(b) = logc(b)/logc(a)
對數(shù)的換底公式表明,任意兩個底不同的對數(shù)可以用一個公共底的對數(shù)來表示。例如,log2(8) = log10(8)/log10(2) =
0.903/0.301 = 3。
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
//對照對數(shù)的換底公式
//log3(n)
}
四:找到最大冪
題中n的范圍是 -2^31 <= n <= 2^31 - 1 ,而在這個范圍內(nèi)3的最大冪是1162261467,在比他大就超過int表示的范圍了,我們直接用它對n求余即可,過求余的結(jié)果是0,說明n是3的冪次方
public boolean isPowerOfThree(int n) {
return (n > 0 && 1162261467 % n == 0);
}
轉(zhuǎn)換為PHP代碼為:文章來源:http://www.zghlxwxcb.cn/news/detail-613731.html
function isPowerOfThree($n) {
return ($n > 0 && 1162261467 % $n == 0);
}
方法來源:
作者:數(shù)據(jù)結(jié)構(gòu)和算法
鏈接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnsdi2/?discussion=xhUFcs
來源:力扣(LeetCode)文章來源地址http://www.zghlxwxcb.cn/news/detail-613731.html
到了這里,關(guān)于3的冪,給定一個整數(shù),寫一個函數(shù)來判斷它是否是 3 的冪次方。如果是,返回 true ;否則,返回 false。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!