不使用循环或递归判断一个数是否为3的幂(leetcode 326)

时间:2023-03-08 23:50:01
不使用循环或递归判断一个数是否为3的幂(leetcode 326)
326. Power of Three
Given an integer, write a function to determine if it is a power of three. Follow up:
Could you do it without using any loop / recursion?

看到这种题目,第一想法就是用递归或者循环来做,但是题目要求了不能用这种方法来做,所以只能另想他法。

假设输入一个数 n,如果 n 是3的幂,那么 3^x = n, 即 x = log10(n) / log10(3), 这里使用了换底公式。那么这样的话就好办了,如果 n 是3的幂,那么x肯定是一个整数,

那么接下来只需要判断 x 是不是整数即可。

判断 x 为整数有两种方法:

1.将 x 强转为int类型,计算小数位是否为0

bool isPowerOfThree(int n) {
double ret = log10(n) / log10();
return ret == (int)ret;
}

2.使用fmod函数

bool isPowerOfThree(int n) {
double ret = log10(n) / log10();
return n > && fmod(ret, ) == ;
}

则此题得解。

我在讨论区也见到一些别的解法,顺便在这里摘录一下(这几种方法的原理都是一样的,因为3是质数,所以3的幂中最大的整数如果能整除 n,那么n = 3 * ... * 3)

bool isPowerOfThree(int n) {
return n> && %n==; // 其中的1162261467是3的幂中最大的整数
}
bool isPowerOfThree(int n) {
int maxPowerOfThree = (int)pow(, (int)(log(INT_MAX)/log()));
return n> && maxPowerOfThree%n==;
}
bool isPowerOfThree(int n) {
return n> && (int)pow(, )%n==;
}