Skip to content
Related Articles

Related Articles

Improve Article

Largest number with maximum trailing nines which is less than N and greater than N-D

  • Last Updated : 03 May, 2021

Given two numbers N and D. The task is to find out the largest number smaller than or equal to N which contains the maximum number of trailing nines and the difference between N and the number should not be greater than D
Examples: 
 

Input: N = 1029, D = 102
Output: 999
1029 has 1 trailing nine while 999 has three 
trailing nine.Also 1029-999 = 30(which is less than 102).

Input: N = 10281, D = 1
Output: 10281

 

A naive approach will be to iterate from N till N-D and find the number with the largest number of trailing nines. 
An efficient approach can be found by some key observations. One key observation for this problem is that the largest number smaller than N ending with at least say(K) nines is 
 

[n – (n MOD 10^k) – 1]

 
Traverse all possible values of k starting from total no of digits of N to 1, and check whether d > n%10^k    . If no such value is obtained, the final answer will be N itself. Otherwise, check for the answer using the above observation.
Below is the implementation of the above approach. 
 



C++




// CPP to implement above function
#include <bits/stdc++.h>
using namespace std;
 
// It's better to use long long
// to handle big integers
#define ll long long
 
// function to count no of digits
ll dig(ll a)
{
    ll count = 0;
    while (a > 0) {
        a /= 10;
        count++;
    }
    return count;
}
 
// function to implement above approach
void required_number(ll num, ll n, ll d)
{
    ll i, j, power, a, flag = 0;
    for (i = num; i >= 1; i--) {
        power = pow(10, i);
        a = n % power;
 
        // if difference between power
        // and n doesn't exceed d
        if (d > a) {
            flag = 1;
            break;
        }
    }
    if (flag) {
        ll t = 0;
 
        // loop to build a number from the
        // appropriate no of digits containing only 9
        for (j = 0; j < i; j++) {
            t += 9 * pow(10, j);
        }
 
        // if the build number is
        // same as original number(n)
        if (n % power == t)
            cout << n;
        else {
 
            // observation
            cout << n - (n % power) - 1;
        }
    }
    else
        cout << n;
}
 
// Driver Code
int main()
{
    ll n = 1029, d = 102;
 
    // variable that stores no of digits in n
    ll num = dig(n);
    required_number(num, n, d);
    return 0;
}

Java




// Java code to implement above function
import java.io.*;
  
class GFG {
     
// It's better to use long
// to handle big integers
// function to count no. of digits
static long dig(long a)
{
    long count = 0;
    while (a > 0)
    {
        a /= 10;
        count++;
    }
    return count;
}
  
// function to implement above approach
 static void required_number(long num, long n, long d)
{
    long i, j, power=1, a, flag = 0;
    for (i = num; i >= 1; i--)
    {
        power = (long)Math.pow(10, i);
        a = n % power;
  
        // if difference between power
        // and n doesn't exceed d
        if (d > a)
        {
            flag = 1;
            break;
        }
    }
     
    if (flag>0)
    {
        long t = 0;
  
        // loop to build a number from the
        // appropriate no of digits containing
        // only 9
        for (j = 0; j < i; j++)
        {
            t += 9 * Math.pow(10, j);
        }
  
        // if the build number is
        // same as original number(n)
        if (n % power == t)
            System.out.print( n);
             
        else {
  
            // observation
            System.out.print( n - (n % power) - 1);
        }
    }
    else
        System.out.print(n);
}
  
    // Driver Code
    public static void main (String[] args)
    {
        long n = 1029, d = 102;
      
        // variable that stores no
        // of digits in n
        long num = dig(n);
        required_number(num, n, d);
    }
}
  
// This code is contributed by chandan_jnu

Python3




# Python3 to implement above function
 
# function to count no of digits
def dig(a):
    count = 0;
    while (a > 0):
        a /= 10
        count+=1
    return count
 
 
# function to implement above approach
def required_number(num, n, d):
    flag = 0
    power=0
    a=0
    for i in range(num,0,-1):
        power = pow(10, i)
        a = n % power
         
        # if difference between power
        # and n doesn't exceed d
         
        if (d > a):
            flag = 1
            break
    if(flag):
        t=0
        # loop to build a number from the
        # appropriate no of digits containing only 9
        for j in range(0,i):
            t += 9 * pow(10, j)
         
        # if the build number is
        # same as original number(n)
        if(n % power ==t):
            print(n,end="")
        else:
            # observation
            print((n - (n % power) - 1),end="")
    else:
        print(n,end="")
# Driver Code
 
if __name__ == "__main__":
    n = 1029
    d = 102
 
# variable that stores no of digits in n
    num = dig(n)
    required_number(num, n, d)
 
# this code is contributed by mits

C#




// C# code to implement
// above function
using System;
 
class GFG
{
     
// It's better to use long
// to handle big integers
// function to count no. of digits
static long dig(long a)
{
    long count = 0;
    while (a > 0)
    {
        a /= 10;
        count++;
    }
    return count;
}
 
// function to implement
// above approach
static void required_number(long num,
                            long n,
                            long d)
{
    long i, j, power = 1, a, flag = 0;
    for (i = num; i >= 1; i--)
    {
        power = (long)Math.Pow(10, i);
        a = n % power;
 
        // if difference between power
        // and n doesn't exceed d
        if (d > a)
        {
            flag = 1;
            break;
        }
    }
     
    if (flag > 0)
    {
        long t = 0;
 
        // loop to build a number
        // from the appropriate no
        // of digits containing only 9
        for (j = 0; j < i; j++)
        {
            t += (long)(9 * Math.Pow(10, j));
        }
 
        // if the build number is
        // same as original number(n)
        if (n % power == t)
            Console.Write( n);
             
        else
        {
 
            // observation
            Console.Write(n - (n % power) - 1);
        }
    }
    else
        Console.Write(n);
}
 
    // Driver Code
    public static void Main()
    {
        long n = 1029, d = 102;
     
        // variable that stores
        // no. of digits in n
        long num = dig(n);
        required_number(num, n, d);
    }
}
 
// This code is contributed
// by chandan_jnu

PHP




<?php
// PHP to implement above function
 
// function to count no of digits
function dig($a)
{
    $count = 0;
    while ($a > 0)
    {
        $a = (int)($a / 10);
        $count++;
    }
    return $count;
}
 
// function to implement above approach
function required_number($num, $n, $d)
{
    $flag = 0;
    for ($i = $num; $i >= 1; $i--)
    {
        $power = pow(10, $i);
        $a = $n % $power;
 
        // if difference between power
        // and n doesn't exceed d
        if ($d > $a)
        {
            $flag = 1;
            break;
        }
    }
    if ($flag)
    {
        $t = 0;
 
        // loop to build a number from the
        // appropriate no of digits containing only 9
        for ($j = 0; $j < $i; $j++)
        {
            $t += 9 * pow(10, $j);
        }
 
        // if the build number is
        // same as original number(n)
        if ($n % $power == $t)
            echo $n;
        else
        {
 
            // observation
            echo ($n - ($n % $power) - 1);
        }
    }
    else
        echo $n;
}
 
// Driver Code
$n = 1029;
$d = 102;
 
// variable that stores no of
// digits in n
$num = dig($n);
required_number($num, $n, $d);
 
// This code is contributed by mits
?>

Javascript




<script>
 
// javascript code to implement above function
 
// It's better to use var
// to handle big integers
// function to count no. of digits
function dig(a)
{
    var count = 0;
    while (a > 0)
    {
        a /= 10;
        count++;
    }
    return count;
}
  
// function to implement above approach
 function required_number(num , n , d)
{
    var i, j, power=1, a, flag = 0;
    for (i = num; i >= 1; i--)
    {
        power = Math.pow(10, i);
        a = n % power;
  
        // if difference between power
        // and n doesn't exceed d
        if (d > a)
        {
            flag = 1;
            break;
        }
    }
     
    if (flag>0)
    {
        var t = 0;
  
        // loop to build a number from the
        // appropriate no of digits containing
        // only 9
        for (j = 0; j < i; j++)
        {
            t += 9 * Math.pow(10, j);
        }
  
        // if the build number is
        // same as original number(n)
        if (n % power == t)
            document.write( n);
             
        else {
  
            // observation
            document.write( n - (n % power) - 1);
        }
    }
    else
        document.write(n);
}
  
    // Driver Code
 var n = 1029, d = 102;
  
 // variable that stores no
 // of digits in n
 var num = dig(n);
 required_number(num, n, d);
 
// This code is contributed by 29AjayKumar
</script>
Output: 
999

 

Time Complexity:O(no of digits)
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :