Count numbers with difference between number and its digit sum greater than specific value - GeeksforGeeks

22 Apr, 2021
Given a positive value N, we need to find the count of numbers smaller than N such that the difference between the number and sum of its digits is greater than or equal to given specific value diff. Examples:  
Input : N = 13, diff = 2
Output : 4
Then 10, 11, 12 and 13 satisfy the given
condition shown below,
10 – sumofdigit(10) = 9 >= 2
11 – sumofdigit(11) = 9 >= 2
12 – sumofdigit(12) = 9 >= 2
13 – sumofdigit(13) = 9 >= 2  
Whereas no number from 1 to 9 satisfies 
above equation so final result will be 4
 
We can solve this problem by observing a fact that for a number k less than N,  
 
if k – sumofdigit(k) >= diff then
above equation will be true for (k+1)
also because we know that sumofdigit(k+1)
is not greater than sumofdigit(k) + 1
so, k + 1 - sumofdigit(k + 1) >= 
k - sumofdigit(k)
but we know that right side of above 
inequality is greater than diff, 
so left side will also be greater than 
diff.
So, finally we can say that if a number k satisfies the difference condition then (k + 1) will also satisfy same equation so our job is to find the smallest number which satisfies the difference condition then all numbers greater than this and up to N will satisfy the condition so our answer will be N – smallest number we found. We can find the smallest number satisfying this condition using binary search so total time complexity of solution will be O(log N)   
C++
Java
Python3
C#
PHP
Javascript
/* C++ program to count total numbers whichhave difference with sum of digits greaterthan specific value */#include <bits/stdc++.h>using namespace std; // Utility method to get sum of digits of Kint sumOfDigit(int K){    // loop until K is not zero    int sod = 0;    while (K)    {        sod += K % 10;        K /= 10;    }    return sod;} // method returns count of numbers smaller than N,// satisfying difference conditionint totalNumbersWithSpecificDifference(int N, int diff){    int low = 1, high = N;     // binary search while loop       while (low <= high)    {        int mid = (low + high) / 2;         /* if difference between number and its sum        of digit is smaller than given difference        then smallest number will be on left side */        if (mid - sumOfDigit(mid) < diff)                   low = mid + 1;                 /* if difference between number and its sum        of digit is greater than or equal to given        difference then smallest number will be on        right side */        else                   high = mid - 1;           }     // return the difference between 'smallest number    // found' and 'N' as result    return (N - high);} // Driver code to test above methodsint main(){    int N = 13;    int diff = 2;     cout << totalNumbersWithSpecificDifference(N, diff);       return 0;}
/*  Java program to count total numbers which   have difference with sum of digits greater   than specific value */ class Test{    //  Utility method to get sum of digits of K    static int sumOfDigit(int K)    {        //  loop until K is not zero        int sod = 0;        while (K != 0)        {            sod += K % 10;            K /= 10;        }        return sod;    }         // method returns count of numbers smaller than N,    // satisfying difference condition    static int totalNumbersWithSpecificDifference(int N, int diff)    {        int low = 1, high = N;              //  binary search while loop           while (low <= high)        {            int mid = (low + high) / 2;                  /* if difference between number and its sum               of digit is smaller than given difference               then  smallest number will be on left side */            if (mid - sumOfDigit(mid) < diff)                       low = mid + 1;                          /* if difference between number and its sum               of digit is greater than or equal to given               difference then  smallest number will be on               right side */            else                      high = mid - 1;               }              // return the difference between 'smallest number        // found' and 'N' as result        return (N - high);    }     // Driver method    public static void main(String args[])    {        int N = 13;        int diff = 2;              System.out.println(totalNumbersWithSpecificDifference(N, diff));    }}
# Python program to count total numbers which# have difference with sum of digits greater# than specific value  # Utility method to get sum of digits of Kdef sumOfDigit(K):     # loop until K is not zero    sod = 0    while (K):             sod =sod + K % 10        K =K // 10         return sod  # method returns count of# numbers smaller than N,# satisfying difference conditiondef totalNumbersWithSpecificDifference(N,diff):     low = 1    high = N     # binary search while loop       while (low <= high):             mid = (low + high) // 2         ''' if difference between number and its sum        of digit is smaller than given difference        then smallest number will be on left side'''        if (mid - sumOfDigit(mid) < diff):                   low = mid + 1         # if difference between number and its sum        # of digit greater than equal to given        # difference then smallest number will be on        # right side           else:                         high = mid - 1                 # return the difference between 'smallest number    # found' and 'N' as result    return (N - high) # Driver code to test above methodsN = 13diff = 2 print(totalNumbersWithSpecificDifference(N, diff))        # This code is contributed by Anant Agarwal.
// C# program to count total numbers// which have difference with sum of // digits greater than specific valueusing System; class Test {         // Utility method to get sum    // of digits of K    static int sumOfDigit(int K)    {                 // loop until K is not zero        int sod = 0;        while (K != 0)        {            sod += K % 10;            K /= 10;        }        return sod;    }         // method returns count of numbers    // smaller than N, satisfying    // difference condition    static int totalNumbersWithSpecificDifference(int N,                                                  int diff)    {        int low = 1, high = N;             // binary search while loop        while (low <= high)        {            int mid = (low + high) / 2;                 // if difference between number and            // its sum of digit is smaller than            // given difference then smallest            // number will be on left side            if (mid - sumOfDigit(mid) < diff)                    low = mid + 1;                         // if difference between number and             // its sum of digit is greater than             // or equal to given difference then             // smallest number will be on right side            else                   high = mid - 1;            }             // return the difference between        // 'smallest number found'        // and 'N' as result        return (N - high);    }     // Driver code    public static void Main()    {        int N = 13;        int diff = 2;             Console.Write(totalNumbersWithSpecificDifference(N, diff));    }} // This code is contributed by nitin mittal
<?php// PHP program to count total numbers which// have difference with sum of digits greater// than specific value // method to get sum of digits of Kfunction sumOfDigit($K){         // loop until K is not zero    $sod = 0;    while ($K)    {        $sod += $K % 10;        $K /= 10;    }    return $sod;} // method returns count of// numbers smaller than N,// satisfying difference conditionfunction totalNumbersWithSpecificDifference($N, $diff){    $low = 1; $high = $N;     // binary search while loop    while ($low <= $high)    {        $mid = floor(($low + $high) / 2);         /* if difference between number and its sum           of digit is smaller than given difference           then smallest number will be on left side */        if ($mid - sumOfDigit($mid) < $diff)                $low = $mid + 1;                 /* if difference between number and its sum           of digit is greater than or equal to given           difference then smallest number will be on           right side */        else               $high = $mid - 1;        }     // return the difference    // between 'smallest number    // found' and 'N' as result    return ($N - $high);} // Driver Code$N = 13;$diff = 2;echo totalNumbersWithSpecificDifference($N, $diff); // This code is contributed by nitin mittal?>
<script> // javascript program to// count total numbers which// have difference with sum// of digits greater// than specific value // method to get sum of digits of Kfunction sumOfDigit(K){         // loop until K is not zero    let sod = 0;    while (K)    {        sod += K % 10;        K /= 10;    }    return sod;} // method returns count of// numbers smaller than N,// satisfying difference conditionfunctiontotalNumbersWithSpecificDifference(N, diff){    let low = 1;    let high = N;     // binary search while loop    while (low <= high)    {        let mid = Math.floor((low + high) / 2);         /* if difference between number and its sum        of digit is smaller than given difference        then smallest number will be on left side */        if (mid - sumOfDigit(mid) < diff)               low = mid + 1;                 /* if difference between number and its sum        of digit is greater than or equal to given        difference then smallest number will be on        right side */        else               high = mid - 1;       }     // return the difference    // between 'smallest number    // found' and 'N' as result    return (N - high);} // Driver Codelet N = 13;let diff = 2;document.write(totalNumbersWithSpecificDifference(N, diff)); // This code is contributed by Bobby </script>
Output: 
4
This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
gottumukkalabobby
Binary Search
number-digits
Mathematical
Searching
Searching
Mathematical
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Print all possible combinations of r elements in a given array of size n
Operators in C / C++
Binary Search
Maximum and minimum of an array using minimum number of comparisons
Linear Search
Search an element in a sorted and rotated array
Find the Missing Number