📜  计算数字与数字总和之差大于特定值的数字

📅  最后修改于: 2021-05-07 00:28:55             🧑  作者: Mango

给定正值N,我们需要找到小于N的数字计数,以使数字与数字总和之间的差大于或等于给定的特定值diff。
例子:

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

我们可以通过观察以下事实来解决此问题:对于小于N的数k,

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.

因此,最后我们可以说,如果数k满足差分条件,那么(k +1)也将满足相同的方程式,因此我们的工作是找到满足差分条件的最小数字,然后所有大于此数字且最大为N的数字将满足条件,因此我们的答案将为N –我们找到的最小数字。
我们可以使用二进制搜索找到满足此条件的最小数字,因此求解的总时间复杂度将为O(log N)

C/C++
/*  C++ program to count total numbers which
   have difference with sum of digits greater 
   than specific value */
#include 
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
/*  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)); 
    }
}


Python3
# 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#
// 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


输出:

4