Count of Numbers such that difference between the number and sum of its digits not less than L

• Last Updated : 01 Jun, 2021

Given a Natural number N and a whole number L, the task is to find the count of numbers, smaller than or equal to N, such that the difference between the number and sum of its digits is not less than L.
Examples:

Input: N = 1500, L = 30
Output: 1461

Input: N = 1546300, L = 30651
Output: 1515631

Approach:
Our solution depends on a simple observation that if a number, say X, is such that the difference of X and sumOfDigits(X) is less than or equal to L, then X+1 is also a valid number. Hence, we have to find a minimum such X using binary search.
Implementation:

C++

 // C++ implementation of above approach#include using namespace std; // Function to calculate the// sum of digitsint sumOfDigits(long long n){    long long sum = 0;     while (n > 0) {        sum += n % 10;        n /= 10;    }     return sum;} // Function to count the numberslong long countDigits(long long num, long long limit){    long long left = 1, right = num, result = 0;     // use binary search    while (left <= right) {         long long mid = (right + left) / 2;         // Check if you are at a valid number or not        if ((mid - sumOfDigits(mid)) >= limit) {             // update the answer at each valid step            result = num - mid + 1;            right = mid - 1;        }        else {             left = mid + 1;        }    }     // return the answer    return result;} // Driver codeint main(){    // Get the value of N and L    long long N = 1546300, L = 30651;     // Count the numbers    cout << countDigits(N, L);     return 0;}

Java

 // Java implementation of above approach class GFG{    // Function to calculate the    // sum of digits    static long sumOfDigits( long n )    {        long sum = 0;             while (n > 0)        {            sum += n % 10;            n /= 10;        }             return sum;    }         // Function to count the numbers    static long countDigits(long num, long limit)    {        long left = 1, right = num, result = 0;             // use binary search        while (left <= right)        {            long mid = (right + left) / 2;                 // Check if you are at a valid number or not            if ((mid - sumOfDigits(mid)) >= limit)            {                     // update the answer at each valid step                result = num - mid + 1;                right = mid - 1;            }            else            {                left = mid + 1;            }        }             // return the answer        return result;    }         // Driver code    public static void main(String []args)    {        // Get the value of N and L        long N = 1546300, L = 30651;             // Count the numbers        System.out.println(countDigits(N, L));    }} // This code is contributed by ihritik

Python3

 # Python3 program for above approach # Function to calculate the sum of digitsdef sumOfDigits(n):    sum = 0     while (n > 0):        sum += n % 10        n = int(n / 10)     return sum # Function to count the numbersdef countDigits(num, limit):    left = 1    right = num    result = 0     # use binary search    while (left <= right):        mid = int((right + left) / 2)         # Check if you are at a valid number or not        if ((mid - sumOfDigits(mid)) >= limit):                         # update the answer at each valid step            result = num - mid + 1            right = mid - 1                 else:            left = mid + 1             # return the answer    return result # Driver codeif __name__ == '__main__':         # Get the value of N and L    N = 1546300    L = 30651     # Count the numbers    print(countDigits(N, L)) # This code is contributed by# Surendra_Gangwar

C#

 // C# implementation of above approachusing System; class GFG{    // Function to calculate the    // sum of digits    static long sumOfDigits( long n )    {        long sum = 0;             while (n > 0)        {            sum += n % 10;            n /= 10;        }             return sum;    }         // Function to count the numbers    static long countDigits(long num, long limit)    {        long left = 1, right = num, result = 0;             // use binary search        while (left <= right) {                 long mid = (right + left) / 2;                 // Check if you are at a valid number or not            if ((mid - sumOfDigits(mid)) >= limit)            {                     // update the answer at each valid step                result = num - mid + 1;                right = mid - 1;            }            else            {                     left = mid + 1;            }        }             // return the answer        return result;    }         // Driver code    public static void Main()    {        // Get the value of N and L        long N = 1546300, L = 30651;             // Count the numbers        Console.WriteLine(countDigits(N, L));    }} // This code is contributed by ihritik

PHP

 0)    {        \$sum += \$n % 10;        \$n /= 10;    }     return \$sum;} // Function to count the numbersfunction countDigits(\$num, \$limit){    \$left = 1;    \$right = \$num;    \$result = 0;     // use binary search    while (\$left <= \$right)    {         \$mid = floor((\$right + \$left) / 2);         // Check if you are at a valid number or not        if ((\$mid - sumOfDigits(\$mid)) >= \$limit)        {             // update the answer at each valid step            \$result = \$num - \$mid + 1;            \$right = \$mid - 1;        }        else        {             \$left = \$mid + 1;        }    }     // return the answer    return \$result;} // Driver code // Get the value of N and L\$N = 1546300;\$L = 30651; // Count the numbersecho countDigits(\$N, \$L); // This code is contributed by Ryuga?>

Javascript


Output:
1515631

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

My Personal Notes arrow_drop_up