Represent a number as the sum of positive numbers ending with 9

Given an integer N, the task is to check if N can be expressed as a sum of integers having 9 as the last digit (9, 19, 29, 39…), or not. If found to be true, then find the minimum count of such integers required to obtain N. Otherwise print -1.

Examples:

Input: N = 156
Output: 4
Explanation:
156 = 9 + 9 + 9 + 129

Input: N = 60
Output: -1
Explanation:
No possible way to obtain sum 60 from numbers having 9 as the last digit.

Naive Approach: This problem can be viewed as a variation of the Coin change problem. For this problem, the coins can be replaced with [9, 19, 29, 39…. up to the last number smaller than N that ends with 9].



Time Complexity: O(N2)
Auxiliary Space: O(N)

Efficient Approach: The above approach can be optimized based on the observation that if the last digit of N is K, then exactly (10 – K) minimum numbers are required to form N.

A sum N can be obtained by adding 10 – K numbers, where K is the last digit of N. 
Therefore, sum N can be obtained by adding 9, (9 – K) times and adding N – (9 * (9 – K)) finally.

Follow the steps below to solve the problem:

  1. Extract the last digit of the given number, K = N % 10
  2. Using the above observation, a total of (10 – K) numbers are required. Now, calculate 9 * (9 – K), as the first 9 – K numbers required to obtain N is 9.
  3. Now, calculate N – 9 * (9 – K) and store in a variable, say z. If z is greater than or equal to 9 and has 9 as its last digit, print 10 – K as the answer. Otherwise, print -1.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the minimum count
// of numbers ending with 9 to form N
int minCountOfNumbers(int N)
{
    // Extract last digit of N
    int k = N % 10;
  
    // Calculate the last digit
    int z = N - (9 * (9 - k));
  
    // If the last digit
    // satisfies the condition
    if (z >= 9 && z % 10 == 9) {
        return 10 - k;
    }
    else
        return -1;
}
  
// Driver Code
int main()
{
    int N = 156;
    cout << minCountOfNumbers(N);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
  
class GFG{
  
// Function to find the minimum count
// of numbers ending with 9 to form N
static int minCountOfNumbers(int N)
{
      
    // Extract last digit of N
    int k = N % 10;
  
    // Calculate the last digit
    int z = N - (9 * (9 - k));
  
    // If the last digit
    // satisfies the condition
    if (z >= 9 && z % 10 == 9)
    {
        return 10 - k;
    }
    else
        return -1;
}
  
// Driver Code
public static void main(String[] args)
{
    int N = 156;
    System.out.print(minCountOfNumbers(N));
}
}
  
// This code is contributed by 29AjayKumar 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach
  
# Function to find the minimum count
# of numbers ending with 9 to form N
def minCountOfNumbers(N):
      
    # Extract last digit of N
    k = N % 10
  
    # Calculate the last digit
    z = N - (9 * (9 - k))
  
    # If the last digit
    # satisfies the condition
    if (z >= 9 and z % 10 == 9):
        return 10 - k
    else:
        return -1
  
# Driver Code
if __name__ == '__main__':
      
    N = 156
      
    print(minCountOfNumbers(N))
  
# This code is contributed by mohit kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
  
class GFG{
  
// Function to find the minimum count
// of numbers ending with 9 to form N
static int minCountOfNumbers(int N)
{
      
    // Extract last digit of N
    int k = N % 10;
  
    // Calculate the last digit
    int z = N - (9 * (9 - k));
  
    // If the last digit
    // satisfies the condition
    if (z >= 9 && z % 10 == 9)
    {
        return 10 - k;
    }
    else
        return -1;
}
  
// Driver Code
public static void Main(String[] args)
{
    int N = 156;
      
    Console.Write(minCountOfNumbers(N));
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


Output: 

4

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

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.