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++ program to count total numbers which have difference with sum of digits greater than specific value */ #include <bits/stdc++.h> using namespace std;
// Utility method to get sum of digits of K int 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 condition 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 to test above methods int 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 K def 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 condition def 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 methods N = 13
diff = 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 value using 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 K function 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 condition function 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 K function 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 condition function totalNumbersWithSpecificDifference(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 Code let N = 13; let diff = 2; document.write( totalNumbersWithSpecificDifference(N, diff) ); // This code is contributed by Bobby </script> |
Output:
4