Find the greater number closest to N having at most one non-zero digit

Given an integer N, the task is to find the closest number to N which is greater than N and contains at most one non-zero digit.

Examples:

Input: N = 540
Output: 600
Explanation: Since the number 600 contains only one non-zero digit, it is the required output is 600.

Input: N = 1000
Output: 2000

Approach: The problem can be solved based on the following observations.



Follow the steps below to solve the problem: 

  1. Initialize a variable, say, ctr to store the count of digits in N.
  2. Compute the value of power(10, ctr – 1)
  3. Print the value of the above-mentioned formula as the required answer.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate
// X ^ n in log(n)
int power(int X, int n) {
     
    // Stores the value
    // of X^n
    int res = 1;
    while(n) {
 
        // If N is odd
        if(n & 1)
        res = res * X;
         
        X = X * X;
        n = n >> 1;
    }
    return res;
     
}
 
// Function to find the
// closest number > N having
// at most 1 non-zero digit
int closestgtNum(int N) {
     
    // Stores the count
    // of digits in N
    int n = log10(N) + 1;
     
    // Stores the power
    // of 10^(n-1)
    int P = power(10, n - 1);
     
    // Stores the
    // last (n - 1) digits
    int Y = N % P;
     
    // Store the answer
    int res = N + (P - Y);
     
    return res;
}
 
// Driver Code
int main()
{
    int N = 120;
    cout<<closestgtNum(N);
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to implement
// the above approach
import java.io.*;
 
class GFG{
  
// Function to calculate
// X ^ n in log(n)
static int power(int X, int n)
{
     
    // Stores the value
    // of X^n
    int res = 1;
     
    while(n != 0)
    {
         
        // If N is odd
        if ((n & 1) != 0)
            res = res * X;
          
        X = X * X;
        n = n >> 1;
    }
    return res;
}
  
// Function to find the
// closest number > N having
// at most 1 non-zero digit
static int closestgtNum(int N)
{
     
    // Stores the count
    // of digits in N
    int n = (int) Math.log10(N) + 1;
      
    // Stores the power
    // of 10^(n-1)
    int P = power(10, n - 1);
      
    // Stores the
    // last (n - 1) digits
    int Y = N % P;
      
    // Store the answer
    int res = N + (P - Y);
      
    return res;
}
  
// Driver Code
public static void main (String[] args)
{
    int N = 120;
  
    // Function call
    System.out.print(closestgtNum(N));
}
}
 
// This code is contributed by code_hunt

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to implement
# the above approach
import math
 
# Function to calculate
# X ^ n in log(n)
def power(X, n):
      
    # Stores the value
    # of X^n
    res = 1
     
    while (n != 0):
  
        # If N is odd
        if (n & 1 != 0):
            res = res * X
          
        X = X * X
        n = n >> 1
     
    return res
      
# Function to find the
# closest number > N having
# at most 1 non-zero digit
def closestgtNum(N):
      
    # Stores the count
    # of digits in N
    n = int(math.log10(N) + 1)
      
    # Stores the power
    # of 10^(n-1)
    P = power(10, n - 1)
      
    # Stores the
    # last (n - 1) digits
    Y = N % P
      
    # Store the answer
    res = N + (P - Y)
      
    return res
 
# Driver Code
N = 120
 
print(closestgtNum(N))
 
# This code is contributed by code_hunt

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to implement
// the above approach
using System;
 
class GFG{
  
// Function to calculate
// X ^ n in log(n)
static int power(int X, int n)
{
     
    // Stores the value
    // of X^n
    int res = 1;
     
    while(n != 0)
    {
         
        // If N is odd
        if ((n & 1) != 0)
            res = res * X;
          
        X = X * X;
        n = n >> 1;
    }
    return res;
}
  
// Function to find the
// closest number > N having
// at most 1 non-zero digit
static int closestgtNum(int N)
{
     
    // Stores the count
    // of digits in N
    int n = (int) Math.Log10(N) + 1;
      
    // Stores the power
    // of 10^(n-1)
    int P = power(10, n - 1);
      
    // Stores the
    // last (n - 1) digits
    int Y = N % P;
      
    // Store the answer
    int res = N + (P - Y);
      
    return res;
}
  
// Driver Code
public static void Main ()
{
    int N = 120;
  
    // Function call
    Console.Write(closestgtNum(N));
}
}
 
// This code is contributed by code_hunt

chevron_right


Output

200










Time Complexity: O(log2N) 
Auxiliary Space: O(log10N)

Efficient Approach:The idea is to increment the value of the first digit of the given integer by 1 and initialize the resultant string to the first digit of the given integer. Finally, append (N – 1) 0s at the end of the resultant string and return the resultant string.

  1. Initialize a string, say res to store the closest greater number with st most one non-zero digit.
  2. First append the value str[0] + 1 at the resultant string and then append (N – 1) 0s at the end of resultant string.
  3. Print the value of res

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to get closest greater
// number with at most non zero digit
string closestgtNum(string str)
{
    // Stores the closest greater number
    // with at most one non-zero digit
    string res = "";
     
    // Stores length of str
    int n = str.length();
     
     
    if(str[0] < '9') {
        res.push_back(str[0] + 1);
    }
    else{
         
        // Append 10 to the end
        // of resultant string
        res.push_back('1');
        res.push_back('0');
    }
     
    // Append n-1 times '0' to the end
    // of resultant string
    for(int i = 0; i < n - 1; i++)
    {
        res.push_back('0');
    }
    return res;
     
     
}
 
// Driver Code
int main()
{
    string str = "120";
    cout<<closestgtNum(str);
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Function to get closest greater
// number with at most non zero digit
static String closestgtNum(String str)
{
     
    // Stores the closest greater number
    // with at most one non-zero digit
    String res = "";
     
    // Stores length of str
    int n = str.length();
     
    if (str.charAt(0) < '9')
    {
        res += (char)(str.charAt(0) + 1);
    }
    else
    {
         
        // Append 10 to the end
        // of resultant String
        res += (char)('1');
        res += (char)('0');
    }
     
    // Append n-1 times '0' to the end
    // of resultant String
    for(int i = 0; i < n - 1; i++)
    {
        res += (char)('0');
    }
    return res;
}
 
// Driver Code
public static void main(String[] args)
{
    String str = "120";
     
    System.out.print(closestgtNum(str));
}
}
 
// This code is contributed by Amit Katiyar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to implement
# the above approach
 
# Function to get closest greater
# number with at most non zero digit
def closestgtNum(str):
     
    # Stores the closest greater number
    # with at most one non-zero digit
    res = "";
 
    # Stores length of str
    n = len(str);
 
    if (str[0] < '9'):
        res += (chr)(ord(str[0]) + 1);
    else:
 
        # Append 10 to the end
        # of resultant String
        res += (chr)('1');
        res += (chr)('0');
 
    # Append n-1 times '0' to the end
    # of resultant String
    for i in range(n - 1):
        res += ('0');
 
    return res;
 
# Driver Code
if __name__ == '__main__':
     
    str = "120";
 
    print(closestgtNum(str));
 
# This code is contributed by Amit Katiyar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to implement
// the above approach
using System;
 
class GFG{
     
// Function to get closest greater
// number with at most non zero digit
public static string closestgtNum(string str)
{
     
    // Stores the closest greater number
    // with at most one non-zero digit
    string res = "";
      
    // Stores length of str
    int n = str.Length;
      
    if (str[0] < '9')
    {
        res = res + (char)(str[0] + 1);
    }
    else
    {
         
        // Append 10 to the end
        // of resultant string
        res = res + '1';
        res = res + '0';
    }
      
    // Append n-1 times '0' to the end
    // of resultant string
    for(int i = 0; i < n - 1; i++)
    {
        res = res + '0';
    }
    return res;
}
 
// Driver code
static void Main()
{
    string str = "120";
     
    Console.WriteLine(closestgtNum(str));
}
}
 
// This code is contributed by divyeshrabadiya07

chevron_right


Output

200










Time Complexity: O(log10N) 
Auxiliary Space: O(log10N)

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.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.