不使用循环或递归判断一个数是否为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(3);
    return ret == (int)ret;
}

2.使用fmod函数

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

则此题得解。

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

bool isPowerOfThree(int n) {
    return n>0 && 1162261467%n==0;    // 其中的1162261467是3的幂中最大的整数
}
bool isPowerOfThree(int n) {
    int maxPowerOfThree = (int)pow(3, (int)(log(INT_MAX)/log(3)));
    return n>0 && maxPowerOfThree%n==0;
}
bool isPowerOfThree(int n) {
    return n>0 && (int)pow(3, 19)%n==0;
}
原文地址:https://www.cnblogs.com/zhuangshq/p/5683928.html