Find a Number X whose sum with its digits is equal to N

Given a positive number N. We need to find number(s) such that sum of digits of those numbers to themselves is equal to N. If no such number is possible print -1. Here N \in [1, 1000000000]

Examples:

Input : N = 21
Output : X = 15
Explanation : X + its digit sum 
            = 15 + 1 + 5 
            = 21 

Input  : N = 5
Output : -1

Input : N = 100000001
Output : X = 99999937
         X = 100000000



Method 1 : (Naive Approach)
We have already discussed the approach here. The approach might not work for N as large as 10^9.

Method 2 : (Efficient)
It is a fact that for a number X < = 1000000000, the sum of digits never exceeds 100. Using this piece of information, we can iterate over all possibilities in the range 0 to 100 on both the sides of the number and check if the number X is eqaul to N – sum of digits of X. All the possibilities will be covered in this range.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find x such that
// X + sumOfDigits(X) = N
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
  
// Computing the sum of digits of x
int sumOfDigits(long int x)
{
    int sum = 0;
    while (x > 0) {
        sum += x % 10;
        x /= 10;
    }
    return sum;
}
  
// Checks for 100 numbers on both left
// and right side of the given number to
// find such numbers X such that X + 
// sumOfDigits(X) = N and updates the answer
// vector accordingly
void compute(vector<long int>& answer, long int n)
{
    // Checking for all possibilities of 
    // the answer
    for (int i = 0; i <= 100; i++) {
  
        // Evaluating the value on the left 
        // side of the given number
        long int valueOnLeft = abs(n - i) +
                      sumOfDigits(abs(n - i));
  
        // Evaluating the value on the right
        // side of the given number
        long int valueOnRight = n + i + sumOfDigits(n + i);
  
        // Checking the condition of equality 
        // on both sides of the given number N 
        // and updating the answer vector
        if (valueOnLeft == n)
            answer.push_back(abs(n - i));
        if (valueOnRight == n)
            answer.push_back(n + i);
    }
}
  
// Driver Function
int main()
{    
    long int N = 100000001;
  
    vector<long int> answer;
    compute(answer, N);
  
    // If no solution exists, print -1
    if (answer.size() == 0)
        cout << -1;
    else {
  
        // If one or more solutions are possible,
        // printing them!
        for (auto it = answer.begin(); it != answer.end(); ++it)
            cout << "X = " << (*it) << endl;
    }
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find x such that
// X + sumOfDigits(X) = N
import java.util.*;
import java.lang.*;
import java.io.*;
  
class GeeksforGeeks {
  
    // Computing the sum of digits of x
    static int sumOfDigits(long x)
    {
        int sum = 0;
        while (x > 0) {
            sum += (x % 10);
            x /= 10;
        }
        return sum;
    }
  
    // Checks for 100 numbers on both left 
    // and right side of the given number to 
    // find such numbers X such that
    // X + sumOfDigits(X) = N and prints solution.
    static void compute(long n)
    {
        long answer[] = new long[100];
        int pos = 0;
  
        // Checking for all possibilities of the answer
        // in the given range
        for (int i = 0; i <= 100; i++) {
  
            // Evaluating the value on the left side of the
            // given number
            long valueOnLeft = Math.abs(n - i) + 
                               sumOfDigits(Math.abs(n - i));
  
            // Evaluating the value on the right side of the
            // given number
            long valueOnRight = (n + i) + sumOfDigits(n + i);
  
            if (valueOnRight == n)
                answer[pos++] = (n + i);
            if (valueOnLeft == n)
                answer[pos++] = Math.abs(n - i);
        }
  
        if (pos == 0)
            System.out.print(-1);
        else
            for (int i = 0; i < pos; i++)
                System.out.println("X = " + answer[i]);
    }
    // Driver Function
    public static void main(String[] args)
    {
        long N = 100000001;
        compute(N);
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find x such that 
# X + sumOfDigits(X) = N 
  
# Computing the sum of digits of x 
def sumOfDigits(x): 
  
    sum = 0
    while (x > 0):
        sum += (x % 10); 
        x = int(x / 10); 
    return sum
  
# Checks for 100 numbers on both left 
# and right side of the given number 
# to find such numbers X such that 
# X + sumOfDigits(X) = N and prints 
# solution. 
def compute(n): 
  
    answer = []; 
    pos = 0
  
    # Checking for all possibilities 
    # of the answer in the given range 
    for i in range(101):
  
        # Evaluating the value on the 
        # left side of the given number 
        valueOnLeft = (abs(n - i) + 
                       sumOfDigits(abs(n - i))); 
  
        # Evaluating the value on the right 
        # side of the given number 
        valueOnRight = (n + i) + sumOfDigits(n + i); 
  
        if (valueOnRight == n): 
            answer.append(n + i); 
        if (valueOnLeft == n): 
            answer.append(abs(n - i)); 
  
    if (len(answer)== 0): 
        print(-1); 
    else:
        for i in range(len(answer)): 
            print("X =", answer[i]);
              
# Driver Code 
N = 100000001
compute(N); 
  
# This code is contributed 
# by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find x such that
// X + sumOfDigits(X) = N
  
using System;
  
public class GFG{
    // Computing the sum of digits of x
    static int sumOfDigits(long x)
    {
        int sum = 0;
        while (x > 0) {
            sum += (int)(x % 10);
            x /= 10;
        }
        return sum;
    }
  
    // Checks for 100 numbers on both left 
    // and right side of the given number to 
    // find such numbers X such that
    // X + sumOfDigits(X) = N and prints solution.
    static void compute(long n)
    {
        long []answer = new long[100];
        int pos = 0;
  
        // Checking for all possibilities of the answer
        // in the given range
        for (int i = 0; i <= 100; i++) {
  
            // Evaluating the value on the left side of the
            // given number
            long valueOnLeft = Math.Abs(n - i) + 
                            sumOfDigits(Math.Abs(n - i));
  
            // Evaluating the value on the right side of the
            // given number
            long valueOnRight = (n + i) + sumOfDigits(n + i);
  
            if (valueOnRight == n)
                answer[pos++] = (n + i);
            if (valueOnLeft == n)
                answer[pos++] = Math.Abs(n - i);
        }
  
        if (pos == 0)
            Console.Write(-1);
        else
            for (int i = 0; i < pos; i++)
                Console.WriteLine("X = " + answer[i]);
    }
    // Driver Function
      
      
    static public void Main (){
        long N = 100000001;
        compute(N);
    }
}

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find x such that 
// X + sumOfDigits(X) = N 
  
// Computing the sum of digits of x 
function sumOfDigits($x
    $sum = 0; 
    while ($x > 0) 
    
        $sum += ($x % 10); 
        $x = (int)$x / 10; 
    
    return $sum
  
// Checks for 100 numbers on both left 
// and right side of the given number 
// to find such numbers X such that 
// X + sumOfDigits(X) = N and prints 
// solution. 
function compute($n
    $answer = array(0); 
    $pos = 0; 
  
    // Checking for all possibilities 
    // of the answer in the given range 
    for ($i = 0; $i <= 100; $i++) 
    
  
        // Evaluating the value on the 
        // left side of the given number 
        $valueOnLeft = abs($n - $i) + 
                        sumOfDigits(abs($n - $i)); 
  
        // Evaluating the value on the right 
        // side of the given number 
        $valueOnRight = ($n + $i) + sumOfDigits($n + $i); 
  
        if ($valueOnRight == $n
            $answer[$pos++] = ($n + $i); 
        if ($valueOnLeft == $n
            $answer[$pos++] =abs($n - $i); 
    
  
    if ($pos == 0) 
        echo (-1),"\n"
    else
        for ($i = 0; $i < $pos; $i++) 
            echo "X = ", $answer[$i], "\n";
              
  
// Driver Code 
$N = 100000001; 
compute($N); 
  
// This code is contributed 
// by Sach_Code
?>

chevron_right



Output:

X = 100000000
X = 99999937

The maximum complexity of this approach can be O(100*len) where len is the number of digits in the number max(len) = 9. Thus the complexity can almost be said to be O(len)



My Personal Notes arrow_drop_up

Waba Laba Dub Dub

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.



Improved By : Sach_Code, Mithun Kumar