【LeetCode-342】 Power of Four(C++)

来源:互联网 发布:阿里云ecs适合hdfs吗 编辑:程序博客网 时间:2024/06/05 19:54

题目要求:要求写一个函数判断一个int型数num是不是4的幂。

解题思路: 可以用循环和不循环两种方式实现。

                     第一种:循环。任一个数如果是4的幂,则重复除以4的话最后会得到一个1。例:64/4=16,16/4=4,4/4=1。且除的过程中全部都是整除,没有余数。可以用这个思路判断num是不是4的幂。

                    第二种:不循环。首先一个数如果是4的幂,那这个数一定是2的幂,如:4^2=(2^2)^2=2^4,所以首先判断num是不是2的幂,如果num是2的幂,则化为二进制的话 一定是10…0的形式,即1后面跟一串0。所以num-1一定是01…1的形式,即0后面跟一串1,并且位数相同。所以num&(num-1)=0。如果满足这个条件则num是2的幂。 如果num是2的幂则接下来判断num是不是4的幂,因为4^n=(2^2)^n=2^(2n)。所以如果num是4的幂,则化为二进制一定是1后面跟偶数个0的形式。故判断num&0x55555555,因为0x55555555的奇数位均为1,而num如果是4的幂,1后面跟偶数个0,则num的1也在奇数位,其他位为0,故两者相与一定为1。如果num是2 的幂而不是4的幂,则化为二进制形式为1后面跟奇数个0,这样num为1的那一位一定在偶数位,其他位为0。0x55555555的偶数位全为0,故两者相与一定为0。

实现代码:

//循环class Solution {public:    bool isPowerOfFour(int num) {        if(num==0)          return false;        while(num!=1&&num%4==0){               num=num/4;        }        if(num==1)           return true;        else           return false;    }};
//不循环class Solution {public:    bool isPowerOfFour(int num) {       if(num&(num-1))           return false;       else if(num&0x55555555)           return true;       else           return false;    }};


0 0
原创粉丝点击