Given an integer D, the task is to find the sum of all the prime numbers whose maximum position of set bits (the farthest set bit from the right) is less than or equal to D.
Note: 2 in binary is 10 and the maximum set bit position is 2. 7 in binary is 111, maximum set bit position is 3.
Examples:
Input: D = 3
Output: 17
2, 3, 5 and 7 are the only primes
which satisfy the given condition.
Input: D = 8
Output: 6081
Brute Force Approach:
The brute force approach involves checking each number up to 2^D – 1 for primality and then checking its binary representation for the maximum set bit position.
Here’s the approach:
- Initialize a variable ans to 0.
- Loop through each number i from 2 to 2^D – 1.
- For each number i, check if it is prime using a primality test such as trial division.
- If the number i is prime, convert it to binary and find the maximum set bit position using the bit manipulation techniques.
- If the maximum set bit position is less than or equal to D, add the number i to ans.
- Return the value of ans.
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n) {
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= sqrt (n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
int sumPrime( int d) {
int n = (1 << d) - 1;
int ans = 0;
for ( int i = 2; i <= n; i++) {
if (isPrime(i)) {
int num = i;
int msb = 0;
while (num > 0) {
msb++;
num >>= 1;
}
if (msb <= d) {
ans += i;
}
}
}
return ans;
}
int main() {
int d = 8;
cout << sumPrime(d) << endl;
return 0;
}
|
Java
import java.lang.Math;
public class Main {
static boolean isPrime( int n) {
if (n <= 1 ) {
return false ;
}
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
static int sumPrime( int d) {
int n = ( 1 << d) - 1 ;
int ans = 0 ;
for ( int i = 2 ; i <= n; i++) {
if (isPrime(i)) {
int num = i;
int msb = 0 ;
while (num > 0 ) {
msb++;
num >>= 1 ;
}
if (msb <= d) {
ans += i;
}
}
}
return ans;
}
public static void main(String[] args) {
int d = 8 ;
System.out.println(sumPrime(d));
}
}
|
Python3
import math
def isPrime(n):
if n < = 1 :
return False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if n % i = = 0 :
return False
return True
def sumPrime(d):
n = ( 1 << d) - 1
ans = 0
for i in range ( 2 , n + 1 ):
if isPrime(i):
num = i
msb = 0
while num > 0 :
msb + = 1
num >> = 1
if msb < = d:
ans + = i
return ans
d = 8
print (sumPrime(d))
|
C#
using System;
class MainClass {
static bool IsPrime( int n)
{
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= Math.Sqrt(n);
i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
static int SumPrime( int d)
{
int n = (1 << d)
- 1;
int ans = 0;
for ( int i = 2; i <= n;
i++) {
if (IsPrime(i)) {
int num = i;
int msb = 0;
while (num > 0) {
msb++;
num >>= 1;
}
if (msb <= d) {
ans += i;
}
}
}
return ans;
}
static void Main()
{
int d = 8;
Console.WriteLine(SumPrime(
d));
}
}
|
Javascript
function isPrime(n) {
if (n <= 1) {
return false ;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
function sumPrime(d) {
let n = (1 << d) - 1;
let ans = 0;
for (let i = 2; i <= n; i++) {
if (isPrime(i)) {
let num = i;
let msb = 0;
while (num > 0) {
msb++;
num >>= 1;
}
if (msb <= d) {
ans += i;
}
}
}
return ans;
}
let d = 8;
console.log(sumPrime(d));
|
Time Complexity: O(2^D * D * sqrt(N))
Auxiliary Space: O(1)
Approach: The maximum number which satisfies the given condition is 2D – 1. So, generate all prime numbers using Sieve of Eratosthenes up to 2D – 1 then find the sum of all the prime numbers in the same range.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void sieve( bool prime[], int n)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
}
int sumPrime( int d)
{
int maxVal = pow (2, d) - 1;
bool prime[maxVal + 1];
memset (prime, true , sizeof (prime));
sieve(prime, maxVal);
int sum = 0;
for ( int i = 2; i <= maxVal; i++) {
if (prime[i]) {
sum += i;
}
}
return sum;
}
int main()
{
int d = 8;
cout << sumPrime(d);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void sieve( boolean prime[], int n)
{
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p;
i <= n; i += p)
prime[i] = false ;
}
}
}
static int sumPrime( int d)
{
int maxVal = ( int ) (Math.pow( 2 , d) - 1 );
boolean []prime = new boolean [maxVal + 1 ];
Arrays.fill(prime, true );
sieve(prime, maxVal);
int sum = 0 ;
for ( int i = 2 ; i <= maxVal; i++)
{
if (prime[i])
{
sum += i;
}
}
return sum;
}
public static void main(String[] args)
{
int d = 8 ;
System.out.println(sumPrime(d));
}
}
|
Python 3
from math import sqrt, pow
def sieve(prime, n):
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( 2 , int (sqrt(n)) + 1 , 1 ):
if (prime[p] = = True ):
for i in range (p * p, n + 1 , p):
prime[i] = False
def sumPrime(d):
maxVal = int ( pow ( 2 , d)) - 1 ;
prime = [ True for i in range (maxVal + 1 )]
sieve(prime, maxVal)
sum = 0
for i in range ( 2 , maxVal + 1 , 1 ):
if (prime[i]):
sum + = i
return sum
if __name__ = = '__main__' :
d = 8
print (sumPrime(d))
|
C#
using System;
using System.Linq;
class GFG
{
static void sieve(Boolean []prime, int n)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p;
i <= n; i += p)
prime[i] = false ;
}
}
}
static int sumPrime( int d)
{
int maxVal = ( int ) (Math.Pow(2, d) - 1);
Boolean []prime = new Boolean[maxVal + 1];
for ( int i = 0; i <= maxVal; i++)
prime.SetValue( true ,i);
sieve(prime, maxVal);
int sum = 0;
for ( int i = 2; i <= maxVal; i++)
{
if (prime[i])
{
sum += i;
}
}
return sum;
}
public static void Main(String[] args)
{
int d = 8;
Console.WriteLine(sumPrime(d));
}
}
|
Javascript
<script>
function sieve(prime, n)
{
prime[0] = false ;
prime[1] = false ;
for ( var p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( var i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
}
function sumPrime(d)
{
var maxVal = Math.pow(2, d) - 1;
var prime = new Array(maxVal + 1);
prime.fill( true );
sieve(prime, maxVal);
var sum = 0;
for ( var i = 2; i <= maxVal; i++) {
if (prime[i]) {
sum += i;
}
}
return sum;
}
var d = 8;
document.write( sumPrime(d));
</script>
|
Time Complexity: O(sqrt(2d))
Auxiliary Space: O(2d)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
04 Apr, 2023
Like Article
Save Article