Number of steps required to convert a binary number to one - GeeksforGeeks

04 May, 2021
Given a binary string str, the task is to print the numbers of steps required to convert it to one by the following operations: 
If ‘S’ is odd add 1 to it.If ‘S’ is even divide it by 2.
If ‘S’ is odd add 1 to it.
If ‘S’ is even divide it by 2.
Examples:
Input: str = “1001001” Output: 12
Input: str = “101110” Output: 8Number ‘101110’ is even, after dividing it by 2 we get an odd number ‘10111’ so we will add 1 to it. Then we’ll get ‘11000’ which is even and can be divide three times continuously in a row and get ’11’ which is odd, adding 1 to it will give us ‘100’ which is even and can be divided 2 times in a row. As, a result we get 1. So 8 times the above two operations were required in this number.
Below is the step by step algorithm to solve this problem:  
Initialize the string S as a binary number.
If the size of the binary is 1, then the required number of actions will be 0.
If the last digit is 0, then its an even number so one operation is required to divide it by 2.
After encountering 1, traverse till you get 0, with every digit one operation will take place.
After encountering 0 after 1 while traversing, replace 0 by 1 and start from step 4 again.
Below is the implementation of above algorithm:  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to count the steps// required to convert a number to 1  #include <bits/stdc++.h>using namespace std;#define ll long long // function to calculate the number of actionsint calculate_(string s){    // if the size of binary is 1    // then the number of actions will be zero    if (s.size() == 1)        return 0;     // initializing the number of actions as 0 at first    int count_ = 0;    for (int i = s.length() - 1; i > 0;) {        // start traversing from the last digit        // if its 0 increment the count and decrement i        if (s[i] == '0') {            count_++;            i--;        }        // if s[i] == '1'        else {            count_++;             // stop until you get 0 in the binary            while (s[i] == '1' && i > 0) {                count_++;                i--;            }            if (i == 0)                count_++;             // when encounter a 0 replace it with 1            s[i] = '1';        }    }    return count_;} // Driver codeint main(){    string s;    s = "10000100000";     cout <<  calculate_(s);    return 0;}
//Java program to count the steps//required to convert a number to 1 public class ACX {     //function to calculate the number of actions    static int calculate_(String s)    {     // if the size of binary is 1     // then the number of actions will be zero     if (s.length() == 1)         return 0;      // initializing the number of actions as 0 at first     int count_ = 0;     char[] s1=s.toCharArray();     for (int i = s.length() - 1; i > 0 {         // start traversing from the last digit         // if its 0 increment the count and decrement i         if (s1[i] == '0') {             count_++;             i--;         }         // if s[i] == '1'         else {             count_++;              // stop until you get 0 in the binary             while (s1[i] == '1' && i > 0) {                 count_++;                 i--;             }             if (i == 0)                 count_++;              // when encounter a 0 replace it with 1             s1[i] = '1';         }     }     return count_;    }     //Driver code    public static void main(String []args)    {                  String s;         s = "10000100000";          System.out.println(calculate_(s));     }}
# Python3 program to count the steps# required to convert a number to 1 # Method to calculate the number of actionsdef calculate_(s):         # if the size of binary is 1    # then the number of actions will be zero    if len(s) == 1:        return 0     # initializing the number of actions as 0 at first    count_ = 0    i = len(s) - 1    while i > 0:                 # start traversing from the last digit        # if its 0 increment the count and decrement i        if s[i] == '0':            count_ += 1            i -= 1                         # if s[i] == '1'        else:            count_ += 1                         # stop until you get 0 in the binary            while s[i] == '1' and i > 0:                count_ += 1                i -= 1            if i == 0:                count_ += 1            # when encounter a 0 replace it with 1            s = s[:i] + "1" + s[i + 1:]    return count_ # Driver codes = "10000100000"print(calculate_(s))     # This code is contributed by# Rajnis09
// C# program to count the steps//required to convert a number to 1using System;class GFG{     // function to calculate the number of actions    static int calculate_(String s)    {        // if the size of binary is 1        // then the number of actions will be zero        if (s.Length == 1)            return 0;             // initializing the number of actions as 0 at first        int count_ = 0;        char[] s1 = s.ToCharArray();        for (int i = s.Length - 1; i > 0;)        {            // start traversing from the last digit            // if its 0 increment the count and decrement i            if (s1[i] == '0')            {                count_++;                i--;            }                         // if s[i] == '1'            else            {                count_++;                     // stop until you get 0 in the binary                while (s1[i] == '1' && i > 0)                {                    count_++;                    i--;                }                if (i == 0)                    count_++;                     // when encounter a 0 replace it with 1                s1[i] = '1';            }        }        return count_;    }     // Driver code    public static void Main(String []args)    {        String s;        s = "10000100000";         Console.WriteLine(calculate_(s));    }} // This code is contributed by princiraj1992
<?php// PHP program to count the steps// required to convert a number to 1 // function to calculate the// number of actionsfunction calculate_($s){    // if the size of binary is 1    // then the number of actions    // will be zero    if (strlen($s) == 1)        return 0;     // initializing the number of    // actions as 0 at first    $count_ = 0;    for ($i = strlen($s) - 1; $i > 0;)    {        // start traversing from the last        // digit if its 0 increment the        // count and decrement i        if ($s[$i] == '0')        {            $count_++;            $i--;        }                 // if $s[$i] == '1'        else        {            $count_++;             // stop until you get 0 in the binary            while ($s[$i] == '1' && $i > 0)            {                $count_++;                $i--;            }            if ($i == 0)                $count_++;             // when encounter a 0 replace            // it with 1            $s[$i] = '1';        }    }    return $count_;} // Driver code $s = "10000100000";echo calculate_($s); // This code is contributed// by Shivi_Aggarwal?>
<script> // Javascript program to count the steps// required to convert a number to 1     // Function to calculate the number of actionsfunction calculate_(s){         // If the size of binary is 1    // then the number of actions    // will be zero    if (s.length == 1)        return 0;         // Initializing the number of    // actions as 0 at first    let count_ = 0;    let s1 = s.split("")         for(let i = s.length - 1; i > 0;)    {                 // Start traversing from the last        // digit if its 0 increment the        // count and decrement i        if (s1[i] == '0')        {            count_++;            i--;        }                 // If s[i] == '1'        else        {            count_++;                         // Stop until you get 0 in the binary            while (s1[i] == '1' && i > 0)            {                count_++;                i--;            }            if (i == 0)                count_++;                         // When encounter a 0            // replace it with 1            s1[i] = '1';        }    }    return count_;} // Driver codelet s = "10000100000"; document.write(calculate_(s)); // This code is contributed by avanitrachhadiya2155 </script>
16
 
Shivi_Aggarwal
ukasp
princiraj1992
Rajnis09
avanitrachhadiya2155
binary-string
Constructive Algorithms
Competitive Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multistage Graph (Shortest Path)
Breadth First Traversal ( BFS ) on a 2D array
Check whether bitwise AND of a number with any subset of an array is zero or not
Shortest path in a directed graph by Dijkstra’s algorithm
5 Best Books for Competitive Programming
5 Best Languages for Competitive Programming
Most important type of Algorithms
Difference between Backtracking and Branch-N-Bound technique
String hashing using Polynomial rolling hash function
Graph implementation using STL for competitive programming | Set 2 (Weighted graph)