Check if a number is Bleak

A number ‘n’ is called Bleak if it cannot be represented as sum of a positive number x and set bit count in x, i.e., x + countSetBits(x) is not equal to n for any non-negative number x.

Examples :

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.

Method 1 (Simple)

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

2) Return true

Below is the implementation of the simple approach.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// A simple C++ program to check Bleak Number
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.*/

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// A simple PHP program 
// to check Bleak Number
  
// Function to get no of 
// set bits in binary
// representation of 
// passed binary no. 
function countSetBits( $x)
{
    $count = 0;
    while ($x
    {
        $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 = 1; $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.
?>

chevron_right



Output :



No
Yes

Time complexity of above solution is O(n Log n).

 

Method 2 (Efficient)
The idea is based on the fact that the largest count of set bits in any number smaller than n cannot exceed ceiling of Log2n. So we need to check only numbers from range n – ceilingLog2(n) to 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

Below is the implementation of the idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// An efficient C++ program to check Bleak Number
#include <bits/stdc++.h>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// An efficient PHP program 
// to check Bleak Number
  
/* Function to get no of set 
   bits in binary representation
   of passed binary no. */
function countSetBits( $x)
{
    $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.
function ceilLog2( $x)
{
      
    $count = 0;
    $x--;
    while ($x > 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
?>

chevron_right



Output :

No
Yes

Time Complexity: O(Log n * Log n)

Note: In GCC, we can directly count set bits using __builtin_popcount(). So we can avoid a separate function for counting set bits.

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Output :

1
4

This article is contributed by Rahuain. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Recommended Posts: