Saturday, January 11, 2025
Google search engine
HomeData Modelling & AIReduce a number N by at most D to maximize count of...

Reduce a number N by at most D to maximize count of trailing nines

Given two positive integers N and D, the task is to decrement the value of N by at most D such that N contains the maximum count of trailing 9s.

Examples:

Input: N = 1025, D = 6 
Output: 1019 
Explanation: 
Decrementing N by 6 modifies N to 1019, which consists of maximum possible count of trailing 9s. 
Therefore, the required output is 1019.

Input: N = 1025, D = 5 
Output: 1025 
Decrementing N by all possible values up to D(= 5), no number can be obtained which contains trailing 9. 
Therefore, the required output is 1025.

Naive Approach: The simplest approach to solve this problem is to iterate over the range [0, D] using variable i and decrement the value of N by i. Finally, print the value of N which contains the maximum possible count of trailing 9
Time Complexity: O(D * log10(N)) 
Auxiliary Space: O(1)

Efficient Approach: The above approach can be optimized based on the following observations: 
 

N % pow(10, i) gives the last i digits of N 
 

Follow the steps below to solve the problem:

  • Initialize a variable say, res to store the decremented value of N with maximum count of trailing 9.
  • Initialize a variable say, cntDigits to store the count of digits in N.
  • Iterate over the range [1, cntDigits] using variable i and check if N % pow(10, i) greater than or equal to D or not. If found to be true, then print the value of res.
  • Otherwise, update res to N % pow(10, i) – 1.

Below is the implementation of the above approach:

C++




// CPP program for the above approach
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
   
// Function to find a number with
// maximum count of trailing nine
void maxNumTrailNine(int n, int d)
{
    int res = n;
   
    // Stores count of digits in n
    int cntDigits = log10(n) + 1;
   
    // Stores power of 10
    int p10 = 10;
   
    for (int i = 1; i <= cntDigits; i++) {
   
        // If last i digits greater than
        // or equal to d
        if (n % p10 >= d) {
            break;
        }
   
        else {
   
            // Update res
            res = n - n % p10 - 1;
        }
   
        // Update p10
        p10 = p10 * 10;
    }
    cout << res;
}
   
// Driver Code
int main()
{
    int n = 1025, d = 6;
   
    // Function Call
    maxNumTrailNine(n, d);
}


Java




// Java program for the above approach
class GFG
{
         
    // Function to find a number with
    // maximum count of trailing nine
    static void maxNumTrailNine(int n, int d)
    {
        int res = n;
       
        // Stores count of digits in n
        int cntDigits = (int)Math.log10(n) + 1;
       
        // Stores power of 10
        int p10 = 10;
       
        for (int i = 1; i <= cntDigits; i++)
        {
       
            // If last i digits greater than
            // or equal to d
            if (n % p10 >= d)
            {
                break;
            }
       
            else
            {
       
                // Update res
                res = n - n % p10 - 1;
            }
       
            // Update p10
            p10 = p10 * 10;
        }
        System.out.println(res);
    }
   
    // Driver Code
    public static void main (String[] args)
    {
        int n = 1025, d = 6;
       
        // Function Call
        maxNumTrailNine(n, d);
    }
}
 
// This code is contribute by AnkThon


Python3




# Python3 program for the above approach
from math import log10
 
# Function to find a number with
# maximum count of trailing nine
def maxNumTrailNine(n, d):
    res = n
 
    # Stores count of digits in n
    cntDigits = int(log10(n) + 1)
 
    # Stores power of 10
    p10 = 10
 
    for i in range(1, cntDigits + 1):
 
        # If last i digits greater than
        # or equal to d
        if (n % p10 >= d):
            break
 
        else:
 
            # Update res
            res = n - n % p10 - 1
 
        # Update p10
        p10 = p10 * 10
 
    print (res)
 
# Driver Code
if __name__ == '__main__':
    n, d = 1025, 6
 
    # Function Call
    maxNumTrailNine(n, d)
 
    # This code is contributed by mohit kumar 29


C#




// C# program for the above approach
using System;
class GFG
{
 
  // Function to find a number with
  // maximum count of trailing nine
  static void maxNumTrailNine(int n, int d)
  {
    int res = n;
 
    // Stores count of digits in n
    int cntDigits = (int)Math.Log10(n) + 1;
 
    // Stores power of 10
    int p10 = 10;     
    for (int i = 1; i <= cntDigits; i++)
    {
 
      // If last i digits greater than
      // or equal to d
      if (n % p10 >= d)
      {
        break;
      }
 
      else
      {
 
        // Update res
        res = n - n % p10 - 1;
      }
 
      // Update p10
      p10 = p10 * 10;
    }
    Console.WriteLine(res);
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
    int n = 1025, d = 6;
 
    // Function Call
    maxNumTrailNine(n, d);
  }
}
 
 
// This code contributed by shikhasingrajput


Javascript




<script>
 
// Javascript program for the above approach
   
// Function to find a number with
// maximum count of trailing nine
function maxNumTrailNine(n, d)
{
    let res = n;
   
    // Stores count of digits in n
    let cntDigits = parseInt(Math.log(n) /
                             Math.log(10)) + 1;
   
    // Stores power of 10
    let p10 = 10;
   
    for(let i = 1; i <= cntDigits; i++)
    {
         
        // If last i digits greater than
        // or equal to d
        if (n % p10 >= d)
        {
            break;
        }
        else
        {
             
            // Update res
            res = n - n % p10 - 1;
        }
   
        // Update p10
        p10 = p10 * 10;
    }
    document.write(res);
}
   
// Driver Code
let n = 1025, d = 6;
 
// Function Call
maxNumTrailNine(n, d);
 
// This code is contributed by souravmahato348
 
</script>


Output: 

1019

 

Time Complexity: O(min(log10(D), log10(N)) 
Auxiliary Space: O(1)

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Commit to GfG’s Three-90 Challenge! Purchase a course, complete 90% in 90 days, and save 90% cost click here to explore.

Last Updated :
28 Apr, 2021
Like Article
Save Article


Previous

<!–

8 Min Read | Java

–>


Next


<!–

8 Min Read | Java

–>

Share your thoughts in the comments

RELATED ARTICLES

Most Popular

Recent Comments