Steps to reduce N to zero by subtracting its most significant digit at every step

• Difficulty Level : Basic
• Last Updated : 21 May, 2021

Given a number . Reduce this number to zero by subtracting the number by it’s most significant digit(Left most digit) at every step. The task is to count the number of steps it takes to be reduced to zero.
Examples

Input: 14
Output: 6
Steps:
14 - 1 = 13
13 - 1 = 12
12 - 1 = 11
11 - 1 = 10
10 - 1 = 9
9 - 9 = 0

Input: 20
Output: 12
Numbers after series of steps:
20, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 0

Naive Approach: A naive approach is to reduce the number by its first digit step-wise and find the count of steps, but the time complexity will be huge if a large number is provided.
Efficient Approach: The main idea of the efficient approach is to reduce the number of steps in the naive approach. We can skip the steps whose leading digits are the same in consecutive numbers, and count them. The algorithm of skipping those numbers with the same leading digits is as follows:

• Let the number be last, count the digits in last and reduce it by 1, because the smallest number with same leading digit with the same count of digits will have that number of zeros in it.
• Find the first digit of the number of last, by last/count.
• Hence the smallest number of same number of count of digits with same leading number will be [first digit * (count-1)]
• the number of steps skipped can be achieved by [(last-smallest number)/first digit].
• Hence the next number last will be last – (first*skipped)

Below is the implementation of the above approach:

C++

 // C++ program to find the count of Steps to// reduce N to zero by subtracting its most// significant digit at every step #include using namespace std; // Function to count the number// of digits in a number mint countdig(int m){    if (m == 0)        return 0;    else        return 1 + countdig(m / 10);} // Function to count the number of// steps to reach 0int countSteps(int x){    // count the total number of stesp    int c = 0;    int last = x;     // iterate till we reach 0    while (last) {         // count the digits in last        int digits = countdig(last);         // decrease it by 1        digits -= 1;         // find the number on whose division,        // we get the first digit        int divisor = pow(10, digits);         // first digit in last        int first = last / divisor;         // find the first number less than        // last where the first digit changes        int lastnumber = first * divisor;         // find the number of numbers        // with same first digit that are jumped        int skipped = (last - lastnumber) / first;         skipped += 1;         // count the steps        c += skipped;         // the next number with a different        // first digit        last = last - (first * skipped);    }     return c;} // Driver codeint main(){    int n = 14;     cout << countSteps(n);     return 0;}

Java

 // Java program to find the count of Steps to// reduce N to zero by subtracting its most// significant digit at every step  class GFG{// Function to count the number// of digits in a number mstatic int countdig(int m){    if (m == 0)        return 0;    else        return 1 + countdig(m / 10);} // Function to count the number of// steps to reach 0static int countSteps(int x){    // count the total number of stesp    int c = 0;    int last = x;     // iterate till we reach 0    while (last>0) {         // count the digits in last        int digits = countdig(last);         // decrease it by 1        digits -= 1;         // find the number on whose division,        // we get the first digit        int divisor = (int)Math.pow(10, digits);         // first digit in last        int first = last / divisor;         // find the first number less than        // last where the first digit changes        int lastnumber = first * divisor;         // find the number of numbers        // with same first digit that are jumped        int skipped = (last - lastnumber) / first;         skipped += 1;         // count the steps        c += skipped;         // the next number with a different        // first digit        last = last - (first * skipped);    }     return c;} // Driver codepublic static void main(String[] args){    int n = 14;     System.out.println(countSteps(n));}}// This code is contributed by mits

Python 3

 # Python 3 program to find the# count of Steps to reduce N to# zero by subtracting its most# significant digit at every step # Function to count the number# of digits in a number mdef countdig(m) :     if (m == 0) :        return 0    else :        return 1 + countdig(m // 10) # Function to count the number# of steps to reach 0def countSteps(x) :         # count the total number    # of stesp    c = 0    last = x     # iterate till we reach 0    while (last) :         # count the digits in last        digits = countdig(last)         # decrease it by 1        digits -= 1         # find the number on whose        # division, we get the first digit        divisor = pow(10, digits)         # first digit in last        first = last // divisor         # find the first number less        # than last where the first        # digit changes        lastnumber = first * divisor         # find the number of numbers        # with same first digit that        # are jumped        skipped = (last - lastnumber) // first         skipped += 1         # count the steps        c += skipped         # the next number with a different        # first digit        last = last - (first * skipped)     return c # Driver coden = 14print(countSteps(n)) # This code is contributed by ANKITRAI1

C#

 // C# program to find the count of Steps to// reduce N to zero by subtracting its most// significant digit at every stepusing System; class GFG{// Function to count the number// of digits in a number mstatic int countdig(int m){    if (m == 0)        return 0;    else        return 1 + countdig(m / 10);} // Function to count the number of// steps to reach 0static int countSteps(int x){    // count the total number of stesp    int c = 0;    int last = x;     // iterate till we reach 0    while (last>0) {         // count the digits in last        int digits = countdig(last);         // decrease it by 1        digits -= 1;         // find the number on whose division,        // we get the first digit        int divisor = (int)Math.Pow(10, digits);         // first digit in last        int first = last / divisor;         // find the first number less than        // last where the first digit changes        int lastnumber = first * divisor;         // find the number of numbers        // with same first digit that are jumped        int skipped = (last - lastnumber) / first;         skipped += 1;         // count the steps        c += skipped;         // the next number with a different        // first digit        last = last - (first * skipped);    }     return c;} // Driver codestatic void Main(){    int n = 14;     Console.WriteLine(countSteps(n));}}// This code is contributed by mits



Javascript


Output:
6

My Personal Notes arrow_drop_up