Skip to content
Related Articles

Related Articles

Sum of bit differences for numbers from 0 to N | Set 2
  • Difficulty Level : Medium
  • Last Updated : 07 Aug, 2020

Given a number N, the task is to calculate the total number of corresponding different bit in the binary representation for every consecutive number from 0 to N.

Examples:

Input: N = 5
Output: 8
Explanation:
Binary Representation of numbers are:
0 -> 000,
1 -> 001,
2 -> 010,
3 -> 011,
4 -> 100,
5 -> 101
Between 1 and 0 -> 1 bit is different
Between 2 and 1 -> 2 bits are different
Between 3 and 2 -> 1 bit is different
Between 4 and 3 -> 3 bits are different
Between 5 and 4 -> 1 bit is different
Total = 1 + 2 + 1 + 3 + 1 = 8

Input: N = 11
Output: 19

For Naive and Efficient Approach please refer to the previous post of this article.



More Efficient Approach: To optimize the above methods, we can use Recursion. To solve the problem, the following observations need to be made

Number:     0 1 2 3 4  5  6  7
Difference: 1 2 1 3 1  2  1  4
Sum:        1 3 4 7 8 10 11 15

We can observe that for N = [1, 2, 3, 4, …..], the sum of different bits in consecutive elements forms the sequence [1, 3, 4, 7, 8, ……]. Hence, Nth term of this series will be our required answer, which can be calculated as:

a(n) = a(n / 2) + n; with base case as a(1) = 1

Below is the implementation for above Recursive approach:

C++




// C++ program to find the sum
// of bit differences between
// consecutive numbers
// from 0 to N using recursion
  
#include <bits/stdc++.h>
using namespace std;
  
// Recursive function to find sum
// of different bits between
// consecutive numbers from 0 to N
int totalCountDifference(int n)
{
  
    // Base case
    if (n == 1)
        return 1;
  
    // Calculate the Nth term
    return n
           + totalCountDifference(n / 2);
}
  
// Driver Code
int main()
{
    // Given Number
    int N = 5;
  
    // Function Call
    cout << totalCountDifference(N);
    return 0;
}

Java




// Java program to find the sum
// of bit differences between
// consecutive numbers from 
// 0 to N using recursion
class GFG{
  
// Recursive function to find sum
// of different bits between
// consecutive numbers from 0 to N
static int totalCountDifference(int n)
{
  
    // Base case
    if (n == 1)
        return 1;
  
    // Calculate the Nth term
    return n + totalCountDifference(n / 2);
}
  
// Driver Code
public static void main(String[] args)
{
      
    // Given number
    int N = 5;
  
    // Function call
    System.out.println(totalCountDifference(N));
}
}
  
// This code is contributed by himanshu77

Python3




# Python3 program to find the sum
# of bit differences between
# consecutive numbers from
# 0 to N using recursion
  
# Recursive function to find sum
# of different bits between
# consecutive numbers from 0 to N
def totalCountDifference (n):
  
    # Base case
    if (n == 1):
        return 1
  
    # Calculate the Nth term
    return n + totalCountDifference(n // 2)
  
# Driver code
  
# Given number
N = 5
  
# Function call
print(totalCountDifference(N))
  
# This code is contributed by himanshu77

C#




// C# program to find the sum
// of bit differences between
// consecutive numbers from
// 0 to N using recursion
using System;
  
class GFG{
  
// Recursive function to find sum
// of different bits between
// consecutive numbers from 0 to N
static int totalCountDifference(int n)
{
  
    // Base case
    if (n == 1)
        return 1;
  
    // Calculate the Nth term
    return n + totalCountDifference(n / 2);
}
  
// Driver Code
public static void Main()
{
      
    // Given number
    int N = 5;
  
    // Function call
    Console.WriteLine(totalCountDifference(N)); 
}
}
  
// This code is contributed by himanshu77
Output:
8


Time Complexity: O(log2N)
Auxiliary Space: O(1)

competitive-programming-img

My Personal Notes arrow_drop_up
Recommended Articles
Page :