📜  程序查找否是否为2的幂

📅  最后修改于: 2021-04-24 20:19:33             🧑  作者: Mango

给定一个正整数,编写一个函数以查找是否为2的幂。
例子 :

Input : n = 4
Output : Yes
22 = 4

Input : n = 7
Output : No

Input : n = 32
Output : Yes
25 = 32

1.一种简单的方法是简单地以2为底的数字取对数,如果得到整数,则该数字为

C++
// C++ Program to find whether a
// no is power of two
#include
using namespace std;
 
// Function to check if x is power of 2
bool isPowerOfTwo(int n)
{
   if(n==0)
   return false;
 
   return (ceil(log2(n)) == floor(log2(n)));
}
 
// Driver program
int main()
{
    isPowerOfTwo(31)? cout<<"Yes"<


C
// C Program to find whether a
// no is power of two
#include
#include
#include
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo(int n)
{
   if(n==0)
   return false;
 
   return (ceil(log2(n)) == floor(log2(n)));
}
 
// Driver program
int main()
{
    isPowerOfTwo(31)? printf("Yes\n"): printf("No\n");
    isPowerOfTwo(64)? printf("Yes\n"): printf("No\n");
    return 0;
}
 
// This code is contributed by bibhudhendra


Java
// Java Program to find whether a
// no is power of two
class GFG
{
/* Function to check if x is power of 2*/
static boolean isPowerOfTwo(int n)
{
    if(n==0)
    return false;
 
return (int)(Math.ceil((Math.log(n) / Math.log(2)))) ==
       (int)(Math.floor(((Math.log(n) / Math.log(2)))));
}
 
// Driver Code
public static void main(String[] args)
{
    if(isPowerOfTwo(31))
    System.out.println("Yes");
    else
    System.out.println("No");
     
    if(isPowerOfTwo(64))
    System.out.println("Yes");
    else
    System.out.println("No");
}
}
 
// This code is contributed by mits


Python3
# Python3 Program to find
# whether a no is
# power of two
import math
 
# Function to check
# Log base 2
def Log2(x):
    if x == 0:
        return false;
 
    return (math.log10(x) /
            math.log10(2));
 
# Function to check
# if x is power of 2
def isPowerOfTwo(n):
    return (math.ceil(Log2(n)) ==
            math.floor(Log2(n)));
 
# Driver Code
if(isPowerOfTwo(31)):
    print("Yes");
else:
    print("No");
 
if(isPowerOfTwo(64)):
    print("Yes");
else:
    print("No");
     
# This code is contributed
# by mits


C#
// C# Program to find whether
// a no is power of two
using System;
 
class GFG
{
     
/* Function to check if
   x is power of 2*/
static bool isPowerOfTwo(int n)
{
 
    if(n==0)
     return false;
 
    return (int)(Math.Ceiling((Math.Log(n) /
                               Math.Log(2)))) ==
           (int)(Math.Floor(((Math.Log(n) /
                              Math.Log(2)))));
}
 
// Driver Code
public static void Main()
{
    if(isPowerOfTwo(31))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
     
    if(isPowerOfTwo(64))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
}
 
// This code is contributed
// by Akanksha Rai(Abby_akku)


PHP


Javascript


C++
#include 
using namespace std;
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo(int n)
{
    if (n == 0)
        return 0;
    while (n != 1)
    {
        if (n%2 != 0)
            return 0;
        n = n/2;
    }
    return 1;
}
 
/*Driver code*/
int main()
{
    isPowerOfTwo(31)? cout<<"Yes\n": cout<<"No\n";
    isPowerOfTwo(64)? cout<<"Yes\n": cout<<"No\n";
    return 0;
}
 
// This code is contributed by rathbhupendra


C
#include
#include
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo(int n)
{
  if (n == 0)
    return 0;
  while (n != 1)
  {
      if (n%2 != 0)
         return 0;
      n = n/2;
  }
  return 1;
}
 
/*Driver program to test above function*/
int main()
{
  isPowerOfTwo(31)? printf("Yes\n"): printf("No\n");
  isPowerOfTwo(64)? printf("Yes\n"): printf("No\n");
  return 0;
}


Java
// Java program to find whether
// a no is power of two
import java.io.*;
 
class GFG {
 
    // Function to check if
    // x is power of 2
    static boolean isPowerOfTwo(int n)
    {
        if (n == 0)
            return false;
         
        while (n != 1)
        {
            if (n % 2 != 0)
                return false;
            n = n / 2;
        }
        return true;
    }
 
    // Driver program
    public static void main(String args[])
    {
        if (isPowerOfTwo(31))
            System.out.println("Yes");
        else
            System.out.println("No");
 
        if (isPowerOfTwo(64))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Nikita tiwari.


Python3
# Python program to check if given
# number is power of 2 or not
 
# Function to check if x is power of 2
def isPowerOfTwo(n):
    if (n == 0):
        return False
    while (n != 1):
            if (n % 2 != 0):
                return False
            n = n // 2
             
    return True
 
# Driver code
if(isPowerOfTwo(31)):
    print('Yes')
else:
    print('No')
if(isPowerOfTwo(64)):
    print('Yes')
else:
    print('No')
 
# This code is contributed by Danish Raza


C#
// C# program to find whether
// a no is power of two
using System;
 
class GFG
{
     
    // Function to check if
    // x is power of 2
    static bool isPowerOfTwo(int n)
    {
        if (n == 0)
            return false;
         
        while (n != 1) {
            if (n % 2 != 0)
                return false;
                 
            n = n / 2;
        }
        return true;
    }
 
    // Driver program
    public static void Main()
    {
        Console.WriteLine(isPowerOfTwo(31) ? "Yes" : "No");
        Console.WriteLine(isPowerOfTwo(64) ? "Yes" : "No");
 
    }
}
 
// This code is contributed by Sam007


PHP


Javascript


C++
// C++ program for above approach
#include 
using namespace std;
 
// Function which checks whether a
// number is a power of 2
bool powerOf2(int n)
{
    // base cases
    // '1' is the only odd number
    // which is a power of 2(2^0)
    if (n == 1)
      return true;
     
    // all other odd numbers are not powers of 2
    else if (n % 2 != 0 || n ==0)
      return false;
     
    // recursive function call
    return powerOf2(n / 2);
}
 
// Driver Code
int main()
{
    int n = 64;//True
    int m = 12;//False
 
    if (powerOf2(n) == 1)
      cout << "True" << endl;
 
    else cout << "False" << endl;
 
    if (powerOf2(m) == 1)
      cout << "True" << endl;
 
    else
      cout << "False" << endl;
}
 
//code contributed by Moukthik a.k.a rowdyninja


Java
// Java program for
// the above approach
import java.util.*;
class GFG{
 
// Function which checks
// whether a number is a
// power of 2
static boolean powerOf2(int n)
{
  // base cases
  // '1' is the only odd number
  // which is a power of 2(2^0)
  if (n == 1)
    return true;
 
  // all other odd numbers are
  // not powers of 2
  else if (n % 2 != 0 ||
           n ==0)
    return false;
 
  // recursive function call
  return powerOf2(n / 2);
}
 
// Driver Code
public static void main(String[] args)
{
  //True
  int n = 64;
   
  //False
  int m = 12;
 
  if (powerOf2(n) == true)
    System.out.print("True" + "\n");
  else System.out.print("False" + "\n");
 
  if (powerOf2(m) == true)
    System.out.print("True" + "\n");
  else
    System.out.print("False" + "\n");
}
}
 
// This code is contributed by Princi Singh


Python3
# Python program for above approach
 
# function which checks whether a
# number is a power of 2
def powerof2(n):
   
    # base cases
    # '1' is the only odd number
    # which is a power of 2(2^0)
    if n == 1:
        return True
     
    # all other odd numbers are not powers of 2
    elif n%2 != 0 or n == 0:
        return False
     
    #recursive function call
    return powerof2(n/2)
   
# Driver Code
if __name__ == "__main__":
   
  print(powerof2(64)) #True
  print(powerof2(12)) #False
   
#code contributed by Moukthik a.k.a rowdyninja


C#
// C# program for above approach
using System;
 
class GFG{
     
// Function which checks whether a
// number is a power of 2
static bool powerOf2(int n)
{
     
    // Base cases
    // '1' is the only odd number
    // which is a power of 2(2^0)
    if (n == 1)
      return true;
      
    // All other odd numbers
    // are not powers of 2
    else if (n % 2 != 0 || n == 0)
      return false;
      
    // Recursive function call
    return powerOf2(n / 2);
}
 
// Driver code
static void Main()
{
   
    int n = 64;//True
    int m = 12;//False
     
    if (powerOf2(n))
    {
        Console.Write("True" + "\n");
    }
    else
    {
        Console.Write("False" + "\n");
    }
     
    if (powerOf2(m))
    {
        Console.Write("True");
    }
    else
    {
        Console.Write("False");
    }
}
}
 
// This code is contributed by rutvik_56


Javascript


C++
#include 
using namespace std;
#define bool int
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
    /* First x in the below expression is for the case when x is 0 */
    return x && (!(x&(x-1)));
}
 
/*Driver code*/
int main()
{
    isPowerOfTwo(31)? cout<<"Yes\n": cout<<"No\n";
    isPowerOfTwo(64)? cout<<"Yes\n": cout<<"No\n";
    return 0;
}
 
// This code is contributed by rathbhupendra


C
#include
#define bool int
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
  /* First x in the below expression is for the case when x is 0 */
  return x && (!(x&(x-1)));
}
 
/*Driver program to test above function*/
int main()
{
  isPowerOfTwo(31)? printf("Yes\n"): printf("No\n");
  isPowerOfTwo(64)? printf("Yes\n"): printf("No\n");
  return 0;
}


Java
// Java program to efficiently
// check for power for 2
 
class Test
{
    /* Method to check if x is power of 2*/
    static boolean isPowerOfTwo (int x)
    {
      /* First x in the below expression is
        for the case when x is 0 */
        return x!=0 && ((x&(x-1)) == 0);
         
    }
     
    // Driver method
    public static void main(String[] args)
    {
         System.out.println(isPowerOfTwo(31) ? "Yes" : "No");
         System.out.println(isPowerOfTwo(64) ? "Yes" : "No");
         
    }
}
// This program is contributed by Gaurav Miglani


Python
# Python program to check if given
# number is power of 2 or not
 
# Function to check if x is power of 2
def isPowerOfTwo (x):
 
    # First x in the below expression
    # is for the case when x is 0
    return (x and (not(x & (x - 1))) )
 
# Driver code
if(isPowerOfTwo(31)):
    print('Yes')
else:
    print('No')
     
if(isPowerOfTwo(64)):
    print('Yes')
else:
    print('No')
     
# This code is contributed by Danish Raza


C#
// C# program to efficiently
// check for power for 2
using System;
 
class GFG
{
    // Method to check if x is power of 2
    static bool isPowerOfTwo (int x)
    {
        // First x in the below expression 
        // is for the case when x is 0
        return x != 0 && ((x & (x - 1)) == 0);
         
    }
     
    // Driver method
    public static void Main()
    {
        Console.WriteLine(isPowerOfTwo(31) ? "Yes" : "No");
        Console.WriteLine(isPowerOfTwo(64) ? "Yes" : "No");
         
    }
}
 
// This code is contributed by Sam007


PHP


Javascript


输出:

No
Yes

时间复杂度: O(log 2 n)

辅助空间: O(1)
2.另一个解决方案是将数字除以二,即迭代地做n = n / 2。在任何迭代中,如果n%2变为非零且n不为1,则n不是2的幂。如果n为1,则为2的幂。

C++

#include 
using namespace std;
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo(int n)
{
    if (n == 0)
        return 0;
    while (n != 1)
    {
        if (n%2 != 0)
            return 0;
        n = n/2;
    }
    return 1;
}
 
/*Driver code*/
int main()
{
    isPowerOfTwo(31)? cout<<"Yes\n": cout<<"No\n";
    isPowerOfTwo(64)? cout<<"Yes\n": cout<<"No\n";
    return 0;
}
 
// This code is contributed by rathbhupendra

C

#include
#include
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo(int n)
{
  if (n == 0)
    return 0;
  while (n != 1)
  {
      if (n%2 != 0)
         return 0;
      n = n/2;
  }
  return 1;
}
 
/*Driver program to test above function*/
int main()
{
  isPowerOfTwo(31)? printf("Yes\n"): printf("No\n");
  isPowerOfTwo(64)? printf("Yes\n"): printf("No\n");
  return 0;
}

Java

// Java program to find whether
// a no is power of two
import java.io.*;
 
class GFG {
 
    // Function to check if
    // x is power of 2
    static boolean isPowerOfTwo(int n)
    {
        if (n == 0)
            return false;
         
        while (n != 1)
        {
            if (n % 2 != 0)
                return false;
            n = n / 2;
        }
        return true;
    }
 
    // Driver program
    public static void main(String args[])
    {
        if (isPowerOfTwo(31))
            System.out.println("Yes");
        else
            System.out.println("No");
 
        if (isPowerOfTwo(64))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
// This code is contributed by Nikita tiwari.

Python3

# Python program to check if given
# number is power of 2 or not
 
# Function to check if x is power of 2
def isPowerOfTwo(n):
    if (n == 0):
        return False
    while (n != 1):
            if (n % 2 != 0):
                return False
            n = n // 2
             
    return True
 
# Driver code
if(isPowerOfTwo(31)):
    print('Yes')
else:
    print('No')
if(isPowerOfTwo(64)):
    print('Yes')
else:
    print('No')
 
# This code is contributed by Danish Raza

C#

// C# program to find whether
// a no is power of two
using System;
 
class GFG
{
     
    // Function to check if
    // x is power of 2
    static bool isPowerOfTwo(int n)
    {
        if (n == 0)
            return false;
         
        while (n != 1) {
            if (n % 2 != 0)
                return false;
                 
            n = n / 2;
        }
        return true;
    }
 
    // Driver program
    public static void Main()
    {
        Console.WriteLine(isPowerOfTwo(31) ? "Yes" : "No");
        Console.WriteLine(isPowerOfTwo(64) ? "Yes" : "No");
 
    }
}
 
// This code is contributed by Sam007

的PHP


Java脚本


输出 :

No
Yes

时间复杂度: O(log 2 n)

辅助空间: O(1)

3.另一种方法是使用此简单的递归解决方案。它使用与上述迭代解决方案相同的逻辑,但是使用递归而不是迭代。

C++

// C++ program for above approach
#include 
using namespace std;
 
// Function which checks whether a
// number is a power of 2
bool powerOf2(int n)
{
    // base cases
    // '1' is the only odd number
    // which is a power of 2(2^0)
    if (n == 1)
      return true;
     
    // all other odd numbers are not powers of 2
    else if (n % 2 != 0 || n ==0)
      return false;
     
    // recursive function call
    return powerOf2(n / 2);
}
 
// Driver Code
int main()
{
    int n = 64;//True
    int m = 12;//False
 
    if (powerOf2(n) == 1)
      cout << "True" << endl;
 
    else cout << "False" << endl;
 
    if (powerOf2(m) == 1)
      cout << "True" << endl;
 
    else
      cout << "False" << endl;
}
 
//code contributed by Moukthik a.k.a rowdyninja

Java

// Java program for
// the above approach
import java.util.*;
class GFG{
 
// Function which checks
// whether a number is a
// power of 2
static boolean powerOf2(int n)
{
  // base cases
  // '1' is the only odd number
  // which is a power of 2(2^0)
  if (n == 1)
    return true;
 
  // all other odd numbers are
  // not powers of 2
  else if (n % 2 != 0 ||
           n ==0)
    return false;
 
  // recursive function call
  return powerOf2(n / 2);
}
 
// Driver Code
public static void main(String[] args)
{
  //True
  int n = 64;
   
  //False
  int m = 12;
 
  if (powerOf2(n) == true)
    System.out.print("True" + "\n");
  else System.out.print("False" + "\n");
 
  if (powerOf2(m) == true)
    System.out.print("True" + "\n");
  else
    System.out.print("False" + "\n");
}
}
 
// This code is contributed by Princi Singh

Python3

# Python program for above approach
 
# function which checks whether a
# number is a power of 2
def powerof2(n):
   
    # base cases
    # '1' is the only odd number
    # which is a power of 2(2^0)
    if n == 1:
        return True
     
    # all other odd numbers are not powers of 2
    elif n%2 != 0 or n == 0:
        return False
     
    #recursive function call
    return powerof2(n/2)
   
# Driver Code
if __name__ == "__main__":
   
  print(powerof2(64)) #True
  print(powerof2(12)) #False
   
#code contributed by Moukthik a.k.a rowdyninja

C#

// C# program for above approach
using System;
 
class GFG{
     
// Function which checks whether a
// number is a power of 2
static bool powerOf2(int n)
{
     
    // Base cases
    // '1' is the only odd number
    // which is a power of 2(2^0)
    if (n == 1)
      return true;
      
    // All other odd numbers
    // are not powers of 2
    else if (n % 2 != 0 || n == 0)
      return false;
      
    // Recursive function call
    return powerOf2(n / 2);
}
 
// Driver code
static void Main()
{
   
    int n = 64;//True
    int m = 12;//False
     
    if (powerOf2(n))
    {
        Console.Write("True" + "\n");
    }
    else
    {
        Console.Write("False" + "\n");
    }
     
    if (powerOf2(m))
    {
        Console.Write("True");
    }
    else
    {
        Console.Write("False");
    }
}
}
 
// This code is contributed by rutvik_56

Java脚本


输出
True
False

4.两个数字的所有幂只有一个一位。所以算一下。设置位,如果得到1,则该数字为2的幂。请参阅以整数对设置位进行计数以对设置位进行计数。

5.如果我们将2的幂乘以1,则唯一的置1位之后的所有未置1的位都将置1;否则,将置位。并且置位变为未置位。
例如对于4(100)和16(10000),我们减去1后得到以下内容
3 –> 011
15 –> 01111

因此,如果数字n为2的幂,则n与n-1的按位与&将为零。我们可以根据n&(n-1)的值说n是2的幂或不是2的幂。当n为0时,表达式n&(n-1)将不起作用。为了处理这种情况,我们的表达式也将变为n&(!n&(n-1))(感谢https://www.geeksforgeeks.org/program -查找是否有二的力量/穆罕默德添加此案)。

下面是此方法的实现。

时间复杂度:O(1)

空间复杂度:O(1)

C++

#include 
using namespace std;
#define bool int
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
    /* First x in the below expression is for the case when x is 0 */
    return x && (!(x&(x-1)));
}
 
/*Driver code*/
int main()
{
    isPowerOfTwo(31)? cout<<"Yes\n": cout<<"No\n";
    isPowerOfTwo(64)? cout<<"Yes\n": cout<<"No\n";
    return 0;
}
 
// This code is contributed by rathbhupendra

C

#include
#define bool int
 
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
  /* First x in the below expression is for the case when x is 0 */
  return x && (!(x&(x-1)));
}
 
/*Driver program to test above function*/
int main()
{
  isPowerOfTwo(31)? printf("Yes\n"): printf("No\n");
  isPowerOfTwo(64)? printf("Yes\n"): printf("No\n");
  return 0;
}

Java

// Java program to efficiently
// check for power for 2
 
class Test
{
    /* Method to check if x is power of 2*/
    static boolean isPowerOfTwo (int x)
    {
      /* First x in the below expression is
        for the case when x is 0 */
        return x!=0 && ((x&(x-1)) == 0);
         
    }
     
    // Driver method
    public static void main(String[] args)
    {
         System.out.println(isPowerOfTwo(31) ? "Yes" : "No");
         System.out.println(isPowerOfTwo(64) ? "Yes" : "No");
         
    }
}
// This program is contributed by Gaurav Miglani   

Python

# Python program to check if given
# number is power of 2 or not
 
# Function to check if x is power of 2
def isPowerOfTwo (x):
 
    # First x in the below expression
    # is for the case when x is 0
    return (x and (not(x & (x - 1))) )
 
# Driver code
if(isPowerOfTwo(31)):
    print('Yes')
else:
    print('No')
     
if(isPowerOfTwo(64)):
    print('Yes')
else:
    print('No')
     
# This code is contributed by Danish Raza   

C#

// C# program to efficiently
// check for power for 2
using System;
 
class GFG
{
    // Method to check if x is power of 2
    static bool isPowerOfTwo (int x)
    {
        // First x in the below expression 
        // is for the case when x is 0
        return x != 0 && ((x & (x - 1)) == 0);
         
    }
     
    // Driver method
    public static void Main()
    {
        Console.WriteLine(isPowerOfTwo(31) ? "Yes" : "No");
        Console.WriteLine(isPowerOfTwo(64) ? "Yes" : "No");
         
    }
}
 
// This code is contributed by Sam007

的PHP


Java脚本


输出 :

No
Yes