• LeetCode


    1. 问题

    231. Power of Two: 判断一个整数是否是2的n次方,其中n是非负整数 

    342. Power of Four: 判断一个整数是否是4的n次方,其中n是非负整数

    326. Power of Three: 判断一个整数是否是3的n次方,其中n是非负整数

    2. 思路

    1)2的n次方 

    不妨列举几个满足条件的例子。

    If n = 0: 2 ^ n = 1

    If n = 1: 2 ^ n = 2 -> 10(二进制表示)

    If n = 2: 2 ^ n = 4 -> 100(二进制表示)

    If n =3: 2 ^ n = 8 -> 1000 (二进制表示)

    ...

    If n = k, 2^n -> 100 .(k个0).. 000 (二进制表示)

    可以看到,所有的2的n次方数,都以1开头,然后跟随了n个0。因此,对应的2 ^ n - 1是: 

    n=1: 2^1 - 1 = 0

    If n = 1: 2 ^ n - 1 = 1 -> (0)1(二进制表示)

    If n = 2: 2 ^ n - 1 = 3 -> (0)11(二进制表示)

    If n =3: 2 ^ n - 1 = 7 -> (0)111 (二进制表示)

    ...

    If n = k, 2^n-1 -> (0)11 .(k个1).. 111 (二进制表示)

    最终代码只需要一行就可以解决:

    class Solution {
    public:
        bool isPowerOfTwo(int num) {
            return !(num&(num-1)) && n >= 1;
        }
    };
    

      

    2)4的n次方

    • 解法1:

    我觉得这道题跟2的n次方是有点像的。唯一的不同是需要解决属于2的n次方但不属于4的n次方的部分。

    $A = {x mid 2^n = x for some n in mathbb{N} }$

    $B = {x mid exists n in mathbb{N}, forall m in mathbb{N} Rightarrow 2^n = x and 4^m e x  }$

    先观察属于2的n次方但不属于4的n次方的部分。

    2 -> 10

    8 -> 1000

    32 -> 100000

    128 -> 10000000

    再观察属于4的n次方的部分。

    1 -> 1

    4 -> 10

    16 -> 10000

    64 -> 1000000

    可以看到,他们唯一的不同就是从右往左数的第2,4,6,8, ... , 2m位上有没有1。

    代码:

    class Solution {
    public:
        bool isPowerOfFour(int n) {
            return (!(n&(n-1))) && n >= 1 && n==(n&0x55555555);       
        }
    }; 
    • 解法(Solution) 2:

    简单来说,所有4的n次方减去1都可以被3整除,但所有属于2的次n方而不属于4的n次方的数减去一都不可以被3整除。部分证明(需要用到离散数学)如下:

    证明1:对任意 $x in C=A-B$ 有 (x - 1) % 3 = 0.

    $4^n=(1+3)^n = C^0_n 1+C^1_n3+...+C^n_n 3^n = 1+3(C^1_n + C^2_n 3 +...+ C^n_n 3^{n-1})$

    $(C^1_n + C^2_n 3 +...+ C^n_n 3^{n-1}) in mathbb{Z} $

    $ herefore (4^n -1) (mod 3) ≡ 0$

    证明2:对任意$ y in A$, 有 (x - 1) % 3 =1.

    定理:$ if a_1 ≡ b_1( mod m), a_2 ≡ b_2( mod m) , then a_1 * a_2 ≡ b_1 * b_2(mod m)$

    $ 2^2 (mod 3)≡ 1, 2^1(mod 3)≡2$

    $ herefore 2^3(mod 3) ≡ 2^1 * 2^2 (mod 3)≡ 2*1 ≡ 2$

    $ herefore 2^5(mod 3) ≡ 2^3 * 2^2 (mod 3)≡ 2*1≡ 2 \ ... \ herefore 2^{2k+1} (mod 3) ≡ (2^{2k-1} (mod  3))*(2^2 (mod 3)) ≡ 2 e 0$

    定理:$ if a_1 ≡ b_1( mod m), a_2 ≡ b_2( mod m) , then a_1 - a_2 ≡ b_1 - b_2(mod m)$

    $ herefore 2^{2k+1} -1(mod 3) ≡ 1 e 0$

     代码Code:

    class Solution {
    public:
        bool isPowerOfFour(int n) {
            return (!(n&(n-1))) && n >= 1 && (n-1)%3 == 0;
        }
    }; 
    

      

     3)3的n次方

    简单来说,如果一个数可以整除3的k次方,那么这个数必然也是3的n次方数(其中n<k)。学过离散数学的可以联想到:

    已知对于任意的一个正整数N,有$N=p_1^{e1}p^{e2}_2...p^{er}_r$ 且$p_1、p_2...p_r$都为素数。而3是一个素数。因此:
    $forall n, min mathbb{N}$
    $n<m and exists kin mathbb{N}, such that m=3^k$
    $if m(mod n)≡0, then there must be n = 3^l for some lin mathbb{N}$

    代码如下:

    class Solution {
    public:
        bool isPowerOfThree(int n) {
            return n > 0 and int(pow(3,19)) % n == 0;
        }
    };
    

     

    类似的,因为2也是个素数,那么对于2的n次方也可以用相似的方法求解:

    class Solution {
    public:
        bool isPowerOfTwo(int n) {
            return n > 0 && (int(pow(2,30))) % n == 0;
            
        }
    };
    

      

  • 相关阅读:
    数据类型转换:高级向低级转换可能出现的问题和取得不同精度的方法
    Xen Server虚拟机数据恢复的方法和数据恢复过程
    VMware虚拟机误删除vmdk文件后如何恢复?
    MSSQL 2000 错误823恢复
    服务器存储误操作导致数据丢失的恢复过程
    我从业11年来遇到的最奇葩的raid0+1数据恢复经历
    Raid 5数据恢复原理以及raid 5数据恢复实际操作案例
    服务器数据恢复_Linux网站服务器故障数据恢复案例
    Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享
    V7000存储数据恢复_底层结构原理拆解及Mdisk磁盘掉线数据恢复方法
  • 原文地址:https://www.cnblogs.com/rgvb178/p/7446991.html
Copyright © 2020-2023  润新知