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

Recommended Posts: