如果数字“ 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