# Count number of step required to reduce N to 1 by following certain rule

Given a positive integer . Find the number of steps required to minimize it to 1. In a single step N either got reduced to half if it is power of 2 else N is reduced to difference of N and its nearest power of 2 which is smaller than N.

Examples:

```Input : N = 2
Output : 1

Input : N = 20
Output : 3
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Simple Approach: As per question a very simple and brute force approach is to iterate over N until it got reduced to 1, where reduction involve two cases:

1. N is power of 2 : reduce n to n/2
2. N is not power of 2: reduce n to n – (2^log2(n))

Efficient approach: Before proceeding to actual result lets have a look over bit representation of an integer n as per problem statement.

1. When an integer is power of 2: In this case bit -representation includes only one set bit and that too is left most. Hence log2(n) i.e. bit-position minus One is the number of step required to reduce it to n. Which is also equal to number of set bit in n-1.
2. When an integer is not power of 2:The remainder of n – 2^(log2(n)) is equal to integer which can be obtained by un-setting the left most set bit. Hence, one set bit removal count as one step in this case.

Hence the actual answer for steps required to reduce n is equal to number of set bits in n-1. Which can be easily calculated either by using the loop or any of method described in the post: Count Set bits in an Integer.

Below is the implementation of the above approach:

## C++

 `// Cpp to find the number of step to reduce n to 1 ` `// C++ program to demonstrate __builtin_popcount() ` `#include ` `using` `namespace` `std; ` ` `  `// Function to return number of steps for reduction ` `int` `stepRequired(``int` `n) ` `{ ` `    ``// builtin function to count set bits ` `    ``return` `__builtin_popcount(n - 1); ` `} ` ` `  `// Driver program ` `int` `main() ` `{ ` `    ``int` `n = 94; ` `    ``cout << stepRequired(n) << endl; ` `    ``return` `0; ` `} `

## Java

 `// Java program to find the number of step to reduce n to 1 ` ` `  `import` `java.io.*; ` `class` `GFG ` `{ ` `    ``// Function to return number of steps for reduction ` `    ``static` `int` `stepRequired(``int` `n) ` `    ``{ ` `        ``// builtin function to count set bits ` `        ``return` `Integer.bitCount(n - ``1``); ` `    ``} ` `     `  `    ``// Driver program ` `    ``public` `static` `void`  `main(String []args) ` `    ``{ ` `        ``int` `n = ``94``; ` `        ``System.out.println(stepRequired(n));  ` `     `  `    ``} ` `} ` ` `  ` `  `// This code is contributed by  ` `// ihritik `

## Python3

 `# Python3 to find the number of step ` `# to reduce n to 1  ` `# Python3 program to demonstrate ` `# __builtin_popcount()  ` ` `  `# Function to return number of ` `# steps for reduction  ` `def` `stepRequired(n) : ` ` `  `    ``# step to count set bits  ` `    ``return` `bin``(``94``).count(``'1'``) ` ` `  `# Driver Code ` `if` `__name__ ``=``=` `"__main__"` `: ` ` `  `    ``n ``=` `94` `    ``print``(stepRequired(n)) ` ` `  `# This code is contributed by Ryuga `

## C#

 `// C# program to find the number of step to reduce n to 1 ` ` `  `using` `System; ` `class` `GFG ` `{ ` `     `  `    ``// function to count set bits ` `    ``static` `int` `countSetBits(``int` `n)  ` `    ``{  ` `   `  `        ``// base case  ` `        ``if` `(n == 0)  ` `            ``return` `0;  ` `   `  `        ``else` `   `  `            ``// if last bit set  ` `            ``// add 1 else add 0  ` `            ``return` `(n & 1) + countSetBits(n >> 1);  ` `    ``} ` `    ``// Function to return number of steps for reduction ` `    ``static` `int` `stepRequired(``int` `n) ` `    ``{ ` `      `  `        ``return` `countSetBits(n - 1); ` `    ``} ` `     `  `    ``// Driver program ` `    ``public` `static` `void` `Main() ` `    ``{ ` `        ``int` `n = 94; ` `        ``Console.WriteLine(stepRequired(n));  ` `     `  `    ``} ` `} ` ` `  ` `  `// This code is contributed by  ` `// ihritik `

## PHP

 ` `

Output:

```5
```

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.