Numbers having difference with digit sum more than s
You are given two positive integer value n and s. You have to find the total number of such integer from 1 to n such that the difference of integer and its digit sum is greater than given s.
Examples :
Input : n = 20, s = 5
Output :11
Explanation : Integer from 1 to 9 have
diff(integer - digitSum) = 0 but for 10 to
20 they have diff(value - digitSum) > 5
Input : n = 20, s = 20
Output : 0
Explanation : Integer from 1 to 20 have diff
(integer - digitSum) > 5
The very first and basic approach to solve this question is to check for all integer starting from 1 to n and for each check whether integer minus digit sum is greater than s or not. This will become very time costly because we have to traverse 1 to n and for each integer we also have to calculate the digit sum.
Before moving to better approach lets have some key analysis about this questions and its features:
- For the largest possible integer (say long long int i.e. 10^18), the maximum possible digit sum is 9*18 (when all of digits are nine) = 162. This means in any case all the integer greater than s + 162 satisfy the condition of integer – digitSum > s.
- All integer less than s can not satisfy the given condition for sure.
- All the integers within a tens range (0-9, 10-19…100-109) does have same value of integer minus digitSum.
Using above three key features we can shorten our approach and time complexity in a manner where we have to iterate only over s to s+163 integers. Beside checking for all integer within range we only check for each 10th integer (e.g 150, 160, 170..).
Algorithm:
// if n < s then return 0
if n<s
return 0
else
// iterate for s to min(n, s+163)
for i=s to i min(n, s+163)
// return n-i+1
if (i-digitSum)>s
return (n-i+1)
// if no such integer found return 0
return 0
C++
#include <bits/stdc++.h>
using namespace std;
int digitSum( long long int n) {
int digSum = 0;
while (n) {
digSum += n % 10;
n /= 10;
}
return digSum;
}
long long int countInteger( long long int n,
long long int s) {
if (n < s)
return 0;
for ( long long int i = s; i <= min(n, s + 163); i++)
if ((i - digitSum(i)) > s)
return (n - i + 1);
return 0;
}
int main() {
long long int n = 1000, s = 100;
cout << countInteger(n, s);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int digitSum( long n)
{
int digSum = 0 ;
while (n > 0 )
{
digSum += n % 10 ;
n /= 10 ;
}
return digSum;
}
public static long countInteger( long n, long s)
{
if (n < s)
return 0 ;
for ( long i = s; i <= Math.min(n, s + 163 ); i++)
if ((i - digitSum(i)) > s)
return (n - i + 1 );
return 0 ;
}
public static void main(String args[])
{
long n = 1000 , s = 100 ;
System.out.println(countInteger(n, s));
}
}
|
Python3
def digitSum(n):
digSum = 0
while (n> 0 ):
digSum + = n % 10
n / / = 10
return digSum
def countInteger(n, s):
if (n < s):
return 0
for i in range (s, min (n, s + 163 ) + 1 ):
if ((i - digitSum(i)) > s):
return (n - i + 1 )
return 0
n = 1000
s = 100
print (countInteger(n, s))
|
C#
using System;
class GFG
{
static long digitSum( long n)
{
long digSum = 0;
while (n > 0)
{
digSum += n % 10;
n /= 10;
}
return digSum;
}
public static long countInteger( long n, long s)
{
if (n < s)
return 0;
for ( long i = s; i <= Math.Min(n, s + 163); i++)
if ((i - digitSum(i)) > s)
return (n - i + 1);
return 0;
}
public static void Main()
{
long n = 1000, s = 100;
Console.WriteLine(countInteger(n, s));
}
}
|
PHP
<?php
function digitSum( $n )
{
$digSum = 0;
while ( $n )
{
$digSum += $n % 10;
$n /= 10;
}
return $digSum ;
}
function countInteger( $n , $s )
{
if ( $n < $s )
return 0;
for ( $i = $s ; $i <= min( $n , $s + 163); $i ++)
if (( $i - digitSum( $i )) > $s )
return ( $n - $i + 1);
return 0;
}
$n = 1000; $s = 100;
echo countInteger( $n , $s );
?>
|
Javascript
<script>
function digitSum(n)
{
let digSum = 0;
while (n > 0)
{
digSum += n % 10;
n /= 10;
}
return digSum;
}
function countInteger(n, s)
{
if (n < s)
return 0;
for (let i = s; i <= Math.min(n, s + 163); i++)
if ((i - digitSum(i)) > s)
return (n - i + 1);
return 0;
}
let n = 1000, s = 100;
document.write(countInteger(n, s));
</script>
|
Output :
891
Time complexity: O(min(n,s+163)*n)
Space complexity : O(1)
Last Updated :
17 Apr, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...