📜  与数字总和的差大于s的数字

📅  最后修改于: 2021-05-06 08:52:05             🧑  作者: Mango

给出两个正整数值n和s。您必须找到从1到n的整数总数,以使整数与其数字和的差大于给定的s。
例子 :

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

解决此问题的最基本的方法是检查从1到n的所有整数,并检查每个整数的负数总和是否大于s。这将变得非常耗时,因为我们必须遍历1到n,并且对于每个整数,我们还必须计算数字总和。
在转向更好的方法之前,让我们对这个问题及其功能进行一些关键分析:

  • 对于最大可能的整数(例如long long int,即10 ^ 18),最大可能的数字总和为9 * 18(当所有数字均为9时)=162。这意味着在任何情况下,所有大于s + 162的整数都满足整数的条件– digitSum> s。
  • 所有小于s的整数肯定不能满足给定条件。
  • 十个范围内的所有整数(0-9、10-19…100-109)的整数减digitSum的值相同。

使用以上三个关键功能,我们可以缩短迭代方法和时间复杂度,而只需要迭代s到s + 163个整数即可。除了检查范围内的所有整数外,我们仅检查每个第十个整数(例如150、160、170 ..)。
算法:

// if n < s then return 0
if ns
            return (n-i+1)

// if no such integer found return 0
return 0
C++
// Program to find number of integer such that
// integer - digSum  > s
#include 
using namespace std;
 
// function for digit sum
int digitSum(long long int n) {
  int digSum = 0;
  while (n) {
    digSum += n % 10;
    n /= 10;
  }
  return digSum;
}
 
// function to calculate count of integer s.t.
// integer - digSum > s
 
long long int countInteger(long long int n,
                          long long int s) {
 
  // if n < s no integer possible
  if (n < s)
    return 0;
 
  // iterate for s range and then calculate
  // total count of such integer if starting
  // integer is found
  for (long long int i = s; i <= min(n, s + 163); i++)
    if ((i - digitSum(i)) > s)
      return (n - i + 1);
 
  // if no integer found return 0
  return 0;
}
 
// driver program
int main() {
  long long int n = 1000, s = 100;
  cout << countInteger(n, s);
  return 0;
}


Java
// Java Program to find number of integer
// such that integer - digSum > s
import java.io.*;
 
class GFG
{
    // function for digit sum
    static int digitSum(long n)
    {
        int digSum = 0;
        while (n > 0)
        {
            digSum += n % 10;
            n /= 10;
        }
        return digSum;
    }
 
    // function to calculate count of integer s.t.
    // integer - digSum > s
    public static long countInteger(long n, long s)
    {
        // if n < s no integer possible
        if (n < s)
            return 0;
     
        // iterate for s range and then calculate
        // total count of such integer if starting
        // integer is found
        for (long i = s; i <= Math.min(n, s + 163); i++)
            if ((i - digitSum(i)) > s)
                return (n - i + 1);
     
        // if no integer found return 0
        return 0;
    }
 
    // Driver program
    public static void main(String args[])
    {
            long n = 1000, s = 100;
            System.out.println(countInteger(n, s));
    }
}
 
// This code is contributed by Anshika Goyal.


Python3
# Program to find number
# of integer such that
# integer - digSum  > s
 
# function for digit sum
def digitSum(n):
 
    digSum = 0
 
    while (n>0):
        digSum += n % 10
        n //= 10
   
    return digSum
  
# function to calculate
# count of integer s.t.
# integer - digSum > s
  
def countInteger(n, s):
     
    # if n < s no integer possible
    if (n < s):
        return 0
  
    # iterate for s range
    # and then calculate
    # total count of such
    # integer if starting
    # integer is found
    for i in range(s,min(n, s + 163)+1):
        if ((i - digitSum(i)) > s):
            return (n - i + 1)
  
    # if no integer found return 0
    return 0
 
# driver code
n = 1000
s = 100
 
print(countInteger(n, s))
 
# This code is contributed
# by Anant Agarwal.


C#
// C# Program to find number of integer
// such that integer - digSum > s
using System;
 
class GFG
{
    // function for digit sum
    static long digitSum(long n)
    {
        long digSum = 0;
         
        while (n > 0)
        {
            digSum += n % 10;
            n /= 10;
        }
        return digSum;
    }
 
    // function to calculate count of integer s.t.
    // integer - digSum > s
    public static long countInteger(long n, long s)
    {
        // if n < s no integer possible
        if (n < s)
            return 0;
     
        // iterate for s range and then calculate
        // total count of such integer if starting
        // integer is found
        for (long i = s; i <= Math.Min(n, s + 163); i++)
            if ((i - digitSum(i)) > s)
                return (n - i + 1);
     
        // if no integer found return 0
        return 0;
    }
 
    // Driver program
    public static void Main()
    {
            long n = 1000, s = 100;
            Console.WriteLine(countInteger(n, s));
    }
}
 
// This code is contributed by vt_m.


PHP
 s
 
// function for digit sum
function digitSum( $n)
{
$digSum = 0;
while ($n)
{
    $digSum += $n % 10;
    $n /= 10;
}
return $digSum;
}
 
// function to calculate count of
// integer s.t. integer - digSum > s
 
function countInteger( $n, $s)
{
 
// if n < s no integer possible
if ($n < $s)
    return 0;
 
// iterate for s range and then 
// calculate total count of such
// integer if starting integer is found
for ( $i = $s; $i <= min($n, $s + 163); $i++)
    if (($i - digitSum($i)) > $s)
    return ($n - $i + 1);
 
// if no integer found return 0
return 0;
}
 
// Driver Code
$n = 1000; $s = 100;
echo countInteger($n, $s);
 
// This code is contributed by anuj_67.
?>


Javascript


输出 :

891