📌  相关文章
📜  检查排序的数组中是否存在数字除以2的幂的ceil

📅  最后修改于: 2021-04-29 16:04:49             🧑  作者: Mango

给定一个已排序的数组arr []和一个整数K ,任务是检查数组中是否存在数字K的除以2的幂的乘方。
注意:如果没有这样的元素,则打印-1。
例子:

方法:想法是尝试使用2的每个幂,并检查是否存在一个从幂0开始的数字上限。使用二进制搜索可以检查数组中是否存在某个元素。

下面是上述方法的实现:

C++14
// C++14 implementation to check
// if a number divided by power
// of two exist in the sorted array
#include  
using namespace std; 
  
// Function to find there exist a
// number or not in the array
int findNumberDivByPowerofTwo(int ar[], 
                              int k, int n)
{
    int found = -1, m = k;
  
    // Loop to check if there exist
    // a number by divided by power of 2
    while (m > 0)
    {
        int l = 0;
        int r = n - 1;
  
        // Binary Search
        while (l <= r)
        {
            int mid = (l + r) / 2;
  
            if (ar[mid] == m)
            {
                found = m;
                break;
            }
            else if (ar[mid] > m)
            {
                r = mid - 1;
            }
            else if (ar[mid] < m)
            {
                l = mid + 1;
            }
        }
  
        // Condition to check the number
        // is found in the array or not
        if (found != -1)
        {
            break;
        }
  
        // Otherwise divide the number
        // by increasing the one more
        // power of 2
        m = m / 2;
    }
    return found;
}
  
// Driver Code
int main()
{
    int arr[] = { 3, 5, 7, 8, 10 };
    int k = 4, n = 5;
      
    cout << findNumberDivByPowerofTwo(arr, k, n);
}
  
// This code is contributed by code_hunt


Java
// Java implementation to check
// if a number divided by power
// of two exist in the sorted array
  
import java.util.Scanner;
  
public class GreeksForGreeksQuestions {
  
    // Function to find there exist a
    // number or not in the array
    static int findNumberDivByPowerofTwo(
        int[] ar, int k, int n)
    {
        int found = -1, m = k;
  
        // Loop to check if there exist
        // a number by divided by power of 2
        while (m > 0) {
            int l = 0;
            int r = n - 1;
  
            // Binary Search
            while (l <= r) {
                int mid = (l + r) / 2;
  
                if (ar[mid] == m) {
                    found = m;
                    break;
                }
                else if (ar[mid] > m) {
                    r = mid - 1;
                }
                else if (ar[mid] < m) {
                    l = mid + 1;
                }
            }
  
            // Condition to check the number
            // is found in the array or not
            if (found != -1) {
                break;
            }
  
            // Otherwise divide the number
            // by increasing the one more
            // power of 2
            m = m / 2;
        }
  
        return found;
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        int arr[] = { 3, 5, 7, 8, 10 };
        int k = 4, n = 5;
  
        System.out.println(
            findNumberDivByPowerofTwo(
                arr, k, n));
    }
}


Python3
# Python3 implementation to check
# if a number divided by power
# of two exist in the sorted array
  
# Function to find there exist a
# number or not in the array
def findNumberDivByPowerofTwo(ar, k, n):
      
    found = -1
    m = k
  
    # Loop to check if there exist
    # a number by divided by power of 2
    while (m > 0):
        l = 0
        r = n - 1
  
        # Binary Search
        while (l <= r):
            mid = (l + r) // 2
  
            if (ar[mid] == m):
                found = m
                break
              
            elif (ar[mid] > m):
                r = mid - 1
              
            elif (ar[mid] < m):
                l = mid + 1
              
        # Condition to check the number
        # is found in the array or not
        if (found != -1):
            break
          
        # Otherwise divide the number
        # by increasing the one more
        # power of 2
        m = m // 2
      
    return found
  
# Driver Code
arr = [ 3, 5, 7, 8, 10 ]
k = 4
n = 5
  
print(findNumberDivByPowerofTwo(arr, k, n))
  
# This code is contributed by code_hunt


C#
// C# implementation to check
// if a number divided by power
// of two exist in the sorted array
using System;
  
class GFG{
      
// Function to find there exist a
// number or not in the array
static int findNumberDivByPowerofTwo(int[] ar, int k,
                                     int n)
{
    int found = -1, m = k;
  
    // Loop to check if there exist
    // a number by divided by power of 2
    while (m > 0) 
    {
        int l = 0;
        int r = n - 1;
  
        // Binary Search
        while (l <= r)
        {
            int mid = (l + r) / 2;
  
            if (ar[mid] == m)
            {
                found = m;
                break;
            }
            else if (ar[mid] > m)
            {
                r = mid - 1;
            }
            else if (ar[mid] < m)
            {
                l = mid + 1;
            }
        }
  
        // Condition to check the number
        // is found in the array or not
        if (found != -1)
        {
            break;
        }
  
        // Otherwise divide the number
        // by increasing the one more
        // power of 2
        m = m / 2;
    }
    return found;
}
  
// Driver Code
public static void Main(String[] args)
{
    int []arr = { 3, 5, 7, 8, 10 };
    int k = 4, n = 5;
  
    Console.WriteLine(findNumberDivByPowerofTwo(
                      arr, k, n));
}
}
  
// This code is contributed by princi singh


输出:
-1