Leetcode: 326. Power of Three
技巧型题目,做笔试的时候看到了,觉得还有点意思。就写了一下。
题目意思是:判断一个数是不是3的幂。不用递归或者循环。
那很明显就考你思路开阔的了。
log法
第一种方法涉及精度,是说判断log3n是不是整数。因为只有3的幂的数才会得到整数。然后用换底公式换成判断log10n/log103。
class Solution {
public:
bool isPowerOfThree(int n) {
double ans = log10(n)/log10(3);
return (ans - (int)ans == 0)?(true):(false);
}
};
暴力法
这种就好说话了,输入是一个32位signed long int的话,范围可以到0~4294967295。完全可以用一个很大的3的幂去除,得到的数如果是整数就是true,否则是false。
class Solution {
public:
bool isPowerOfThree(int n) {
double threepowmax=pow(3,20);
double threepowmin=pow(3,15);
if(n<0 || !n)
return false;
double ans;
if(n<threepowmin)
ans = threepowmin / n;
else
ans = threepowmax / n;
return (ans - (int)ans == 0)?(true):(false);
}
};
就是意外的条件判断要多些,因为log10不接受0或者负数,这样返回后ans肯定是0,肯定是false的。但是除法可以接受负数,所以要对0和负数做判断。另外因为精度问题,当n比较小的时候,ans比较大。这时候如果还是用一个很大的3的幂去除,得到的ans会溢出(因为判断ans是否整数用的是ans-(int)ans,ans太大的话,转回int会截断。所以小的n用小的幂去除,大的n用大的去除。