LeetCode题解:342. Power of Four

题目链接:

342. Power of Four


题目描述:

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?

中文翻译:

给定一个有符号的整数(32位),写一个函数来判断一下这个数是否是4的次幂。
例如16是4的次幂,但是5就不是4的次幂。
而且题目要求不能使用循环或者递归来求解


题目解释:

求一个数是否是4的次幂,我们的常规想法是:迭代除4,看是否是能除尽即可。这种常规方式是需要循环或者递归的,其实我们从另一个角度来想:我们使用循环的原因是想对num进行降幂处理,直到能够处理,对于次幂我们可以使用log函数,一次运算就可以降幂,那么降幂之后我们如何处理呢?如果目标数为4的次幂,我们求log后是不会损失数据的,所以求完log函数后我们再对结果求次幂pow()函数,还原回去的数还是原来的目标数,如果目标数不是4的次幂,那么我们还原回去是有误差的,当然这里对某一个数求4的对数C++函数库里没有直接的函数,我们需要使用数学上的换底公式进行处理 。
换底公式:
换底公式


解题方案:

利用换底公式求目标数的对数,然后对结果求4的次幂,判断最后的结果跟原目标数是否有误差。这里要注意:题目给定的是有符号整数,要判处负数和1的干扰


AC代码:

//判断一个数是否为4的次幂
bool isPowerOfFour(int num) {
  if(num < 1) return false;
  if(num == 1) return true;
  //求log4(num)利用换底公式
  int n = floor(log(num) / log(4));

  if(pow(4, n) == num){
    return true;
  }
  return false;
}

你可能感兴趣的:(算法技巧,leetcode)