📜  检查数字是否为荒凉

📅  最后修改于: 2021-04-27 22:25:10             🧑  作者: Mango

如果数字“ n”不能表示为正数x的总和,并且不能在x中设置位数,则称为“泄漏”,即,对于任何非负数x,x + countSetBits(x)不等于n。
例子 :

Input : n = 3
Output : false
3 is not Bleak as it can be represented
as 2 + countSetBits(2).

Input : n = 4
Output : true
4 is t Bleak as it cannot be represented 
as sum of a number x and countSetBits(x)
for any number x.

方法1(简单)

bool isBleak(n)
1) Consider all numbers smaller than n
    a) If x + countSetBits(x) == n
           return false

2) Return true

下面是简单方法的实现。

C++
// A simple C++ program to check Bleak Number
#include 
using namespace std;
 
/* Function to get no of set bits in binary
   representation of passed binary no. */
int countSetBits(int x)
{
    unsigned int count = 0;
    while (x) {
        x &= (x - 1);
        count++;
    }
    return count;
}
 
// Returns true if n is Bleak
bool isBleak(int n)
{
    // Check for all numbers 'x' smaller
    // than n.  If x + countSetBits(x)
    // becomes n, then n can't be Bleak
    for (int x = 1; x < n; x++)
        if (x + countSetBits(x) == n)
            return false;
 
    return true;
}
 
// Driver code
int main()
{
    isBleak(3) ? cout << "Yes\n" : cout << "No\n";
    isBleak(4) ? cout << "Yes\n" : cout << "No\n";
    return 0;
}


Java
// A simple Java program to check Bleak Number
import java.io.*;
 
class GFG {
 
    /* Function to get no of set bits in binary
       representation of passed binary no. */
    static int countSetBits(int x)
    {
        int count = 0;
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
        return count;
    }
 
    // Returns true if n is Bleak
    static boolean isBleak(int n)
    {
        // Check for all numbers 'x' smaller
        // than n.  If x + countSetBits(x)
        // becomes n, then n can't be Bleak
        for (int x = 1; x < n; x++)
            if (x + countSetBits(x) == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void main(String args[])
    {
        if (isBleak(3))
            System.out.println("Yes");
        else
            System.out.println("No");
        if (isBleak(4))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
 
/*This code is contributed by Nikita Tiwari.*/


Python3
# A simple Python 3 program
# to check Bleak Number
 
# Function to get no of set
# bits in binary
# representation of passed
# binary no.
def countSetBits(x) :
     
    count = 0
     
    while (x) :
        x = x & (x-1)
        count = count + 1
     
    return count
     
# Returns true if n
# is Bleak
def isBleak(n) :
 
    # Check for all numbers 'x'
    # smaller than n. If x +
    # countSetBits(x) becomes
    # n, then n can't be Bleak.
    for x in range(1, n) :
         
        if (x + countSetBits(x) == n) :
            return False
             
    return True
     
# Driver code
if(isBleak(3)) :
    print( "Yes")
else :
    print("No")
 
if(isBleak(4)) :
    print("Yes")
else :
    print( "No")
     
# This code is contributed by Nikita Tiwari.


C#
// A simple C# program to check
// Bleak Number
using System;
 
class GFG {
 
    /* Function to get no of set
    bits in binary representation
    of passed binary no. */
    static int countSetBits(int x)
    {
        int count = 0;
         
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
         
        return count;
    }
 
    // Returns true if n is Bleak
    static bool isBleak(int n)
    {
         
        // Check for all numbers
        // 'x' smaller than n. If
        // x + countSetBits(x)
        // becomes n, then n can't
        // be Bleak
        for (int x = 1; x < n; x++)
         
            if (x + countSetBits(x)
                              == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void Main()
    {
        if (isBleak(3))
            Console.Write("Yes");
        else
            Console.WriteLine("No");
             
        if (isBleak(4))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by
// Nitin mittal


PHP


Javascript


C++
// An efficient C++ program to check Bleak Number
#include 
using namespace std;
 
/* Function to get no of set bits in binary
   representation of passed binary no. */
int countSetBits(int x)
{
    unsigned int count = 0;
    while (x) {
        x &= (x - 1);
        count++;
    }
    return count;
}
 
// A function to return ceiling of log x
// in base 2. For example, it returns 3
// for 8 and 4 for 9.
int ceilLog2(int x)
{
    int count = 0;
    x--;
    while (x > 0) {
        x = x >> 1;
        count++;
    }
    return count;
}
 
// Returns true if n is Bleak
bool isBleak(int n)
{
    // Check for all numbers 'x' smaller
    // than n.  If x + countSetBits(x)
    // becomes n, then n can't be Bleak
    for (int x = n - ceilLog2(n); x < n; x++)
        if (x + countSetBits(x) == n)
            return false;
 
    return true;
}
 
// Driver code
int main()
{
    isBleak(3) ? cout << "Yes\n" : cout << "No\n";
    isBleak(4) ? cout << "Yes\n" : cout << "No\n";
    return 0;
}


Java
// An efficient Java program to
// check Bleak Number
import java.io.*;
 
class GFG {
 
    /* Function to get no of set bits in
    binary representation of passed binary
    no. */
    static int countSetBits(int x)
    {
        int count = 0;
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
        return count;
    }
 
    // A function to return ceiling of log x
    // in base 2. For example, it returns 3
    // for 8 and 4 for 9.
    static int ceilLog2(int x)
    {
        int count = 0;
        x--;
        while (x > 0) {
            x = x >> 1;
            count++;
        }
        return count;
    }
 
    // Returns true if n is Bleak
    static boolean isBleak(int n)
    {
        // Check for all numbers 'x' smaller
        // than n. If x + countSetBits(x)
        // becomes n, then n can't be Bleak
        for (int x = n - ceilLog2(n); x < n; x++)
            if (x + countSetBits(x) == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        if (isBleak(3))
            System.out.println("Yes");
        else
            System.out.println("No");
 
        if (isBleak(4))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
// This code is contributed by Prerna Saini


Python3
# An efficient Python 3 program
# to check Bleak Number
import math
 
# Function to get no of set
# bits in binary representation
# of passed binary no.
def countSetBits(x) :
     
    count = 0
     
    while (x) :
        x = x & (x - 1)
        count = count + 1
     
    return count
     
# A function to return ceiling
# of log x in base 2. For
# example, it returns 3 for 8
# and 4 for 9.
def ceilLog2(x) :
     
    count = 0
    x = x - 1
     
    while (x > 0) :
        x = x>>1
        count = count + 1
     
    return count
     
# Returns true if n is Bleak
def isBleak(n) :
     
    # Check for all numbers 'x'
    # smaller than n. If x +
    # countSetBits(x) becomes n,
    # then n can't be Bleak
    for x in range ((n - ceilLog2(n)), n) :
         
        if (x + countSetBits(x) == n) :
            return False
 
    return True
 
# Driver code
if(isBleak(3)) :
    print("Yes")
else :
    print( "No")
     
if(isBleak(4)) :
    print("Yes")
else :
    print("No")
     
# This code is contributed by Nikita Tiwari.


C#
// An efficient C# program to check
// Bleak Number
using System;
 
class GFG {
 
    /* Function to get no of set
    bits in binary representation
    of passed binary no. */
    static int countSetBits(int x)
    {
        int count = 0;
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
        return count;
    }
 
    // A function to return ceiling
    // of log x in base 2. For
    // example, it returns 3 for 8
    // and 4 for 9.
    static int ceilLog2(int x)
    {
        int count = 0;
        x--;
        while (x > 0) {
            x = x >> 1;
            count++;
        }
        return count;
    }
 
    // Returns true if n is Bleak
    static bool isBleak(int n)
    {
         
        // Check for all numbers
        // 'x' smaller than n. If
        // x + countSetBits(x)
        // becomes n, then n
        // can't be Bleak
        for (int x = n - ceilLog2(n);
                          x < n; x++)
            if (x + countSetBits(x)
                               == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void Main()
    {
        if (isBleak(3))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
 
        if (isBleak(4))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by anuj_67.


PHP
 0)
    {
        $x = $x >> 1;
        $count++;
    }
    return $count;
}
 
// Returns true if n is Bleak
function isBleak( $n)
{
     
    // Check for all numbers 'x' smaller
    // than n. If x + countSetBits(x)
    // becomes n, then n can't be Bleak
    for ($x = $n - ceilLog2($n); $x < $n; $x++)
        if ($x + countSetBits($x) == $n)
            return false;
 
    return true;
}
 
    // Driver code
    if(isBleak(3))
        echo "Yes\n" ;
     
    else
        echo "No\n";
     
    if(isBleak(4))
        echo "Yes\n" ;
     
    else
        echo "No\n";
         
// This code is contributed by anuj_67
?>


CPP
// C++ program to demonstrate __builtin_popcount()
#include 
using namespace std;
 
int main()
{
    cout << __builtin_popcount(4) << endl;
    cout << __builtin_popcount(15);
 
    return 0;
}


输出 :

No
Yes

上述解决方案的时间复杂度为O(n Log n)。
方法2(高效)
该想法基于这样一个事实,即任何小于n的数字中最大的置位位数不能超过Log 2 n的上限。因此,我们只需要检查范围为n – ceilingLog2(n)到n的数字。

bool isBleak(n)
1) Consider all numbers n - ceiling(Log2n) to n-1
    a) If x + countSetBits(x) == n
           return false

2) Return true

以下是该想法的实现。

C++

// An efficient C++ program to check Bleak Number
#include 
using namespace std;
 
/* Function to get no of set bits in binary
   representation of passed binary no. */
int countSetBits(int x)
{
    unsigned int count = 0;
    while (x) {
        x &= (x - 1);
        count++;
    }
    return count;
}
 
// A function to return ceiling of log x
// in base 2. For example, it returns 3
// for 8 and 4 for 9.
int ceilLog2(int x)
{
    int count = 0;
    x--;
    while (x > 0) {
        x = x >> 1;
        count++;
    }
    return count;
}
 
// Returns true if n is Bleak
bool isBleak(int n)
{
    // Check for all numbers 'x' smaller
    // than n.  If x + countSetBits(x)
    // becomes n, then n can't be Bleak
    for (int x = n - ceilLog2(n); x < n; x++)
        if (x + countSetBits(x) == n)
            return false;
 
    return true;
}
 
// Driver code
int main()
{
    isBleak(3) ? cout << "Yes\n" : cout << "No\n";
    isBleak(4) ? cout << "Yes\n" : cout << "No\n";
    return 0;
}

Java

// An efficient Java program to
// check Bleak Number
import java.io.*;
 
class GFG {
 
    /* Function to get no of set bits in
    binary representation of passed binary
    no. */
    static int countSetBits(int x)
    {
        int count = 0;
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
        return count;
    }
 
    // A function to return ceiling of log x
    // in base 2. For example, it returns 3
    // for 8 and 4 for 9.
    static int ceilLog2(int x)
    {
        int count = 0;
        x--;
        while (x > 0) {
            x = x >> 1;
            count++;
        }
        return count;
    }
 
    // Returns true if n is Bleak
    static boolean isBleak(int n)
    {
        // Check for all numbers 'x' smaller
        // than n. If x + countSetBits(x)
        // becomes n, then n can't be Bleak
        for (int x = n - ceilLog2(n); x < n; x++)
            if (x + countSetBits(x) == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        if (isBleak(3))
            System.out.println("Yes");
        else
            System.out.println("No");
 
        if (isBleak(4))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
// This code is contributed by Prerna Saini

Python3

# An efficient Python 3 program
# to check Bleak Number
import math
 
# Function to get no of set
# bits in binary representation
# of passed binary no.
def countSetBits(x) :
     
    count = 0
     
    while (x) :
        x = x & (x - 1)
        count = count + 1
     
    return count
     
# A function to return ceiling
# of log x in base 2. For
# example, it returns 3 for 8
# and 4 for 9.
def ceilLog2(x) :
     
    count = 0
    x = x - 1
     
    while (x > 0) :
        x = x>>1
        count = count + 1
     
    return count
     
# Returns true if n is Bleak
def isBleak(n) :
     
    # Check for all numbers 'x'
    # smaller than n. If x +
    # countSetBits(x) becomes n,
    # then n can't be Bleak
    for x in range ((n - ceilLog2(n)), n) :
         
        if (x + countSetBits(x) == n) :
            return False
 
    return True
 
# Driver code
if(isBleak(3)) :
    print("Yes")
else :
    print( "No")
     
if(isBleak(4)) :
    print("Yes")
else :
    print("No")
     
# This code is contributed by Nikita Tiwari.

C#

// An efficient C# program to check
// Bleak Number
using System;
 
class GFG {
 
    /* Function to get no of set
    bits in binary representation
    of passed binary no. */
    static int countSetBits(int x)
    {
        int count = 0;
        while (x != 0) {
            x &= (x - 1);
            count++;
        }
        return count;
    }
 
    // A function to return ceiling
    // of log x in base 2. For
    // example, it returns 3 for 8
    // and 4 for 9.
    static int ceilLog2(int x)
    {
        int count = 0;
        x--;
        while (x > 0) {
            x = x >> 1;
            count++;
        }
        return count;
    }
 
    // Returns true if n is Bleak
    static bool isBleak(int n)
    {
         
        // Check for all numbers
        // 'x' smaller than n. If
        // x + countSetBits(x)
        // becomes n, then n
        // can't be Bleak
        for (int x = n - ceilLog2(n);
                          x < n; x++)
            if (x + countSetBits(x)
                               == n)
                return false;
 
        return true;
    }
 
    // Driver code
    public static void Main()
    {
        if (isBleak(3))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
 
        if (isBleak(4))
            Console.WriteLine("Yes");
        else
            Console.WriteLine("No");
    }
}
 
// This code is contributed by anuj_67.

的PHP

 0)
    {
        $x = $x >> 1;
        $count++;
    }
    return $count;
}
 
// Returns true if n is Bleak
function isBleak( $n)
{
     
    // Check for all numbers 'x' smaller
    // than n. If x + countSetBits(x)
    // becomes n, then n can't be Bleak
    for ($x = $n - ceilLog2($n); $x < $n; $x++)
        if ($x + countSetBits($x) == $n)
            return false;
 
    return true;
}
 
    // Driver code
    if(isBleak(3))
        echo "Yes\n" ;
     
    else
        echo "No\n";
     
    if(isBleak(4))
        echo "Yes\n" ;
     
    else
        echo "No\n";
         
// This code is contributed by anuj_67
?>

输出 :

No
Yes

时间复杂度:O(Log n * Log n)
注意:在GCC中,我们可以使用__builtin_popcount()直接计数设置位。因此,我们可以避免使用单独的函数来计数设置位。

CPP

// C++ program to demonstrate __builtin_popcount()
#include 
using namespace std;
 
int main()
{
    cout << __builtin_popcount(4) << endl;
    cout << __builtin_popcount(15);
 
    return 0;
}

输出 :

1
4