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

题目要求:要求写一个函数判断一个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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值