leetcode 4的幂

原题链接;
https://leetcode-cn.com/problems/power-of-four/

题目描述:

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。

题意很明确, 就是给一个32 位有符号整数, 判断它是不是4的整数次方( n = 4 k n=4^{k} n=4k).
为了避免歧义, 这里认为 k ≥ 0 k\ge0 k0

总结了下, 大致有如下几种思路:

思路1: 枚举

既然是32位整数, 就从1( 4 0 4^{0} 40)开始, 直到 2 31 − 1 2^{31} - 1 2311,
这种方法说起来, 对可能的结果不多的情况下还是比较有效的, 不过当然一般不会这么干.
代码如下:

bool isPowerOfFour(int num) {
    switch(num){   
        case 1 << 0:
        case 1 << 2:
        case 1 << 4:
        case 1 << 6:
        case 1 << 8:
        case 1 << 10:
        case 1 << 12:
        case 1 << 14:
        case 1 << 16:
        case 1 << 18:
        case 1 << 20:
        case 1 << 22:
        case 1 << 24:
        case 1 << 26:
        case 1 << 28:
        case 1 << 30:
        // case 1 << 32: // 这个num为0时不能通过
            return true;
        default:
            return false;     
    }
}

思路2: 枚举(迭代实现)

bool isPowerOfFour(int num) {
    if (num < 1) {
         return false;
    }
    
    if (num & (num - 1) != 0) { // not 2^n
        return false;
    }
    
    int i = 0;
    int t = 0;
    for (; i < 32; i += 2) {
        t = 1 << i;
        if (t == num) {
            return true;
        }
        if (t > num) {
            return false;
        }
    }
    return false;
}

思路3: 使用"魔数" 0x55555555

0x55555555这个数是啥呢? 看它的二进制(4位一隔, 方便观察):
0101 0101 0101 0101 0101 0101 0101 0101‬
发现从右到左(从低位到高位), 其中的奇数位(1, 3, 5…)都为1, 偶数位都为0.
而4的整数幂:

k k k 4 k 4^{k} 4k 4 k 4^{k} 4k的二进制形式
0 1 0000 0001
1 4 0000 0100
2 16 0001 0000
3 64 0100 0000

就写这几个吧, 能说明问题就可以, 发现:
4 k 4^{k} 4k的二进制展开中, 2 k + 1 2k+1 2k+1位为1, 其余位为0.

其实也很容易想: 4 0 = 1 4^{0}=1 40=1的二进制中1在第一位, 4 1 = 4 0 × 4 4^{1}=4^{0}\times4 41=40×4, 也就是在 4 0 4^{0} 40的基础上左移两位, 自然就有上边的结论.

有了上面的基础知识, 问题就简单了, 直接看代码吧:

bool isPowerOfFour(int num) {
     return ((num & (num-1)) == 0) && num > 0 && ((num  & 0x55555555) == num) ? true : false;
}

其中(num & (num-1)) == 0)是判断num为2的整数幂, 可参看我的另一篇文章 .

思路4: 利用同余性质

先说下结论:

a ≡ b ⇒ a n ≡ b n ( m o d m ) ,    ( a , b , n 均 为 整 数 , 且 n ≥ 0 ) a \equiv b \Rarr a^{n} \equiv b^{n} \pmod m, \space\space (a, b, n均为整数,且n \ge 0) abanbn(modm),  (a,b,n,n0)

那么, 令 a = 2 , b = − 1 , m = 3 a=2, b=-1, m = 3 a=2,b=1,m=3, 则: 2 ≡ − 1 ⇒ 2 n ≡ ( − 1 ) n ( m o d 3 ) 2\equiv-1 \Rarr 2^{n}\equiv(-1)^{n} \pmod 3 212n(1)n(mod3),
n = 2 k   ( k ≥ 0 ) n=2k \space (k \ge 0) n=2k (k0), 即n为偶数时, 有:
2 2 k ≡ ( − 1 ) 2 k ⇒ 4 k ≡ 1   ( m o d 3 ) , ( k ≥ 0 ) 2^{2k} \equiv (-1)^{2k} \Rarr 4^{k} \equiv 1 \space \pmod 3, (k \ge 0) 22k(1)2k4k1 (mod3),(k0)

也就是说:
4的幂等于3的整数倍再加1

那么:

bool isPowerOfFour(int num) {
     return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0 ? true : false;
}

csdn博客这latex公式怎么左对齐? 求告知.

结论 a ≡ b ⇒ a n ≡ b n ( m o d m ) ,    ( a , b , n 均 为 整 数 , 且 n ≥ 0 ) a \equiv b \Rarr a^{n} \equiv b^{n} \pmod m, \space\space (a, b, n均为整数,且n \ge 0) abanbn(modm),  (a,b,n,n0)的证明如下(数学归纳法):

  1. n = 0 , 1 n=0, 1 n=0,1时, 命题显然成立;
  2. 假设当 n = k   ( k ≥ 2 ) n=k \space (k\ge2) n=k (k2)时, a k ≡ b k ( m o d m ) a^{k} \equiv b^{k} \pmod m akbk(modm)成立,即 a k − b k = q m   ( q 为 整 数 ) a^{k} - b^{k} = qm \space (q为整数) akbk=qm (q);
  3. 那么当 n = k + 1 n=k+1 n=k+1
    ∵ a ≡ b ( m o d m ) \because a \equiv b \pmod m ab(modm)
    ∴ a − b = l m   ( l 为 整 数 ) \therefore a - b = lm \space (l为整数) ab=lm (l)
    ∴ a k + 1 − b k + 1 = a k + 1 − a b k + a b k − b k + 1 = a ( a k − b k ) + ( a − b ) b k = a q m + l m b k = m ( a q + l b k ) = m K   ( K 为 整 数 ) \begin{aligned} \therefore a^{k+1} - b^{k+1} &= a^{k+1} - ab^{k} + ab^{k} - b^{k+1} \\ &= a(a^{k} - b^{k}) + (a - b)b^{k} \\ &= aqm + lmb^{k} \\ &= m(aq + lb^{k}) \\ &= mK \space (K为整数) \\ \end{aligned} ak+1bk+1=ak+1abk+abkbk+1=a(akbk)+(ab)bk=aqm+lmbk=m(aq+lbk)=mK (K)
    也就是说: a k + 1 ≡ b k + 1 ( m o d m ) a^{k+1} \equiv b^{k+1} \pmod m ak+1bk+1(modm)成立
    故由数学归纳法知, 原命题成立.
    证毕.

参考

https://blog.csdn.net/u010564321/article/details/51210749
https://www.zybang.com/question/4627e5673ce201796fa7e9da810e3d30.html

欢迎补充指正!

你可能感兴趣的:(算法)