zoukankan      html  css  js  c++  java
  • 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;
            
        }
    };
    

      

  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/rgvb178/p/7446991.html
Copyright © 2011-2022 走看看