Given a number n. Find the sum of all numbers up to n whose 2 bits are set.
Examples:
Input : 10
Output : 33
3 + 5 + 6 + 9 + 10 = 33
Input : 100
Output : 762
Naive Approach: Find each number up to n whose 2 bits are set. If its 2 bits are set add it to the sum.
C++
#include <bits/stdc++.h>
using namespace std;
int countSetBits( int n)
{
int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
int findSum( int n)
{
int sum = 0;
for ( int i = 1; i <= n; i++)
if (countSetBits(i) == 2)
sum += i;
return sum;
}
int main()
{
int n = 10;
cout << findSum(n);
return 0;
}
|
Java
public class Main {
static int countSetBits( int n)
{
int count = 0 ;
while (n > 0 ) {
n &= (n - 1 );
count++;
}
return count;
}
static int findSum( int n)
{
int sum = 0 ;
for ( int i = 1 ; i <= n; i++)
if (countSetBits(i) == 2 )
sum += i;
return sum;
}
public static void main(String[] args)
{
int n = 10 ;
System.out.println(findSum(n));
}
}
|
Python3
def countSetBits(n):
count = 0
while (n):
n = n & (n - 1 )
count = count + 1
return count
def findSum(n):
sum = 0
for i in range ( 1 ,n + 1 ):
if (countSetBits(i) = = 2 ):
sum = sum + i
return sum
n = 10
print (findSum(n))
|
C#
using System;
class GFG
{
static int countSetBits( int n)
{
int count = 0;
while (n > 0)
{
n = n & (n - 1);
count++;
}
return count;
}
static int findSum( int n)
{
int sum = 0;
for ( int i = 1; i <= n; i++)
if (countSetBits(i) == 2)
sum += i;
return sum;
}
static public void Main ()
{
int n = 10;
Console.WriteLine(findSum(n));
}
}
|
PHP
<?php
function countSetBits( $n )
{
$count = 0;
while ( $n )
{
$n &= ( $n - 1);
$count ++;
}
return $count ;
}
function findSum( $n )
{
$sum = 0;
for ( $i = 1; $i <= $n ; $i ++)
if (countSetBits( $i ) == 2)
$sum += $i ;
return $sum ;
}
$n = 10;
echo findSum( $n );
?>
|
Javascript
<script>
function countSetBits(n)
{
let count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
function findSum(n)
{
let sum = 0;
for (let i = 1; i <= n; i++)
if (countSetBits(i) == 2)
sum += i;
return sum;
}
let n = 10;
document.write(findSum(n));
</script>
|
Output:
33
Time Complexity : O(n)
Space Complexity : O(1)
Efficient Approach: The number whose 2 bits are set is of the form 2^x + 2^y and this number is less than n. So we have to find only numbers in the range up to n which is of form 2^i + 2^j where i > 0 and 2^i < n and 0 <= j < i.
C++
#include <bits/stdc++.h>
using namespace std;
int findSum( int n)
{
int sum = 0;
for ( int i = 1; (1 << i) < n; i++) {
for ( int j = 0; j < i; j++) {
int num = (1 << i) + (1 << j);
if (num <= n)
sum += num;
}
}
return sum;
}
int main()
{
int n = 10;
cout << findSum(n);
return 0;
}
|
Java
public class Main {
static int findSum( int n)
{
int sum = 0 ;
for ( int i = 1 ; 1 << i < n; i++) {
for ( int j = 0 ; j < i; j++) {
int num = ( 1 << i) + ( 1 << j);
if (num <= n)
sum += num;
}
}
return sum;
}
public static void main(String[] args)
{
int n = 10 ;
System.out.println(findSum(n));
}
}
|
Python3
def findSum(n) :
sum = 0
i = 1
while (( 1 << i) < n ) :
for j in range ( 0 , i) :
num = ( 1 << i) + ( 1 << j)
if (num < = n) :
sum + = num
i + = 1
return sum
n = 10
print (findSum(n))
|
C#
using System;
public class main {
static int findSum( int n)
{
int sum = 0;
for ( int i = 1; 1 << i < n; i++)
{
for ( int j = 0; j < i; j++)
{
int num = (1 << i) + (1 << j);
if (num <= n)
sum += num;
}
}
return sum;
}
public static void Main(String []args)
{
int n = 10;
Console.WriteLine(findSum(n));
}
}
|
PHP
<?php
<?php
function findSum( $n )
{
$sum = 0;
for ( $i = 1; (1 << $i ) < $n ; $i ++)
{
for ( $j = 0; $j < $i ; $j ++)
{
$num = (1 << $i ) + (1 << $j );
if ( $num <= $n )
$sum += $num ;
}
}
return $sum ;
}
$n = 10;
echo findSum( $n );
?>
|
Javascript
<script>
function findSum(n)
{
let sum = 0;
for (let i = 1; 1 << i < n; i++)
{
for (let j = 0; j < i; j++)
{
let num = (1 << i) + (1 << j);
if (num <= n)
sum += num;
}
}
return sum;
}
let n = 10;
document.write(findSum(n));
</script>
|
Output :
33
Time Complexity : O((log n)*(log n))
Space Complexity : O(1)
This article is contributed by nuclode. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.