📜  满足m的数量+ sum(m)+ sum(sum(m))= N

📅  最后修改于: 2021-04-23 20:57:07             🧑  作者: Mango

给定一个整数N,找出满足条件m + sum(m)+ sum(sum(m))= N的数字(m)的计数其中sum(m)表示m中的数字之和。给定N <= 10e9。

例子:

Input: 9
Output: 1
Explanation: Only 1 positive integer satisfies 
             the condition that is 3, 
            3 + sum(3) + sum(sum(3)) = 3 + 3 + 3 
                                     = 9 

Input: 9939
Output: 4
Explanation: m can be 9898, 9907, 9910 and 9913. 
             9898 + sum(9898) + sum(sum(9898))  
              = 9898 + 34 + 7 = 9939.
             9907 + sum(9907) + sum(sum(9907)) 
              = 9907 + 25 + 7 = 9939.
             9910 + sum(9910) + sum(sum(9910)) 
              = 9910 + 19 + 10 = 9939.
             9913 + sum(9913) + sum(sum(9913))  
              = 9913 + 22 + 4 = 9939.  

方法:首先要注意的是,给定约束N <= 10e9。这意味着sum(x)的任何数字最大为81,这是因为10e9以下的最大数字为999999999,其数字加起来为81。sum(sum(x))的最大情况为16(数字为79) <= 81),因此最多需要检查81 + 16(即97)。我们只需要从N – 97迭代到N并检查哪些整数满足该方程式,因为没有小于N-97的整数可以满足该方程式,任何大于N的整数也不能满足该方程式。

下面是上述方法的实现。

C++
// CPP program to count numbers
// satisfying equation.
#include 
using namespace std;
  
// function that returns sum of 
// digits in a number
int sum(int n)
{
    int rem = 0;
  
    // initially sum of digits is 0
    int sum_of_digits = 0;
  
    // loop runs till all digits 
    // have been extracted
    while (n > 0) {
      
        // last digit from backside
        rem = n % 10;
  
        // sums up the digits
        sum_of_digits += rem;
  
        // the number is reduced to the
        // number removing the last digit
        n = n / 10;
    }
      
    // returns the sum of digits in a number
    return sum_of_digits;
}
  
// function to calculate the count of
// such occurrences
int count(int n)
{
    // counter to calculate the occurrences
    int c = 0;
  
    // loop to traverse from n-97 to n
    for (int i = n - 97; i <= n; i++) {
  
        // calls the function to calculate 
        // the sum of digits of i
        int a = sum(i);
  
        // calls the function to calculate
        // the sum of digits of a
        int b = sum(a);
  
        // if the summation is equal to n
        // then increase counter by 1
        if ((i + a + b) == n) {
            c += 1;
        }
    }
      
    // returns the count
    return c;
}
  
// driver program to test the above function
int main()
{
    int n = 9939;
      
    // calls the function to get the answer
    cout << count(n) << endl;
  
    return 0;
}


Java
// Java program to count numbers
// satisfying equation.
import java.io.*;
  
class GFG {
      
    // function that returns sum of 
    // digits in a number
    static int sum(int n)
    {
        int rem = 0;
      
        // initially sum of digits is 0
        int sum_of_digits = 0;
      
        // loop runs till all digits 
        // have been extracted
        while (n > 0)
        {
          
            // last digit from backside
            rem = n % 10;
      
            // sums up the digits
            sum_of_digits += rem;
      
            // the number is reduced to the
            // number removing the last digit
            n = n / 10;
        }
          
        // returns the sum of digits in a number
        return sum_of_digits;
    }
      
    // function to calculate the count of
    // such occurrences
    static int count(int n)
    {
        // counter to calculate the occurrences
        int c = 0;
      
        // loop to traverse from n-97 to n
        for (int i = n - 97; i <= n; i++)
        {
      
            // calls the function to calculate 
            // the sum of digits of i
            int a = sum(i);
      
            // calls the function to calculate
            // the sum of digits of a
            int b = sum(a);
      
            // if the summation is equal to n
            // then increase counter by 1
            if ((i + a + b) == n) 
            {
                c += 1;
            }
        }
          
        // returns the count
        return c;
    }
  
    // driver program to test the above function
    public static void main (String[] args) 
    {
        int n = 9939;
        // calls the function to get the answer
        System.out.println ( count(n) );
      
    }
}
  
// This article is contributed by vt_m


Python3
# Python program
# to count numbers
# satisfying equation.
  
# function that returns sum of 
# digits in a number
def sum(n):
  
    rem = 0
   
    #initially sum of digits is 0
    sum_of_digits = 0
   
    # loop runs till all digits 
    # have been extracted
    while (n > 0):
       
        # last digit from backside
        rem = n % 10
   
        # sums up the digits
        sum_of_digits += rem
   
        # the number is reduced to the
        # number removing the last digit
        n = n // 10
  
    # returns the sum
    # of digits in a number
    return sum_of_digits
   
# function to calculate
# the count of
# such occurrences
def count(n):
  
    # counter to calculate the occurrences
    c = 0
   
    # loop to traverse from n - 97 to n
    for i in range(n - 97,n+1):
   
        # calls the function to calculate 
        # the sum of digits of i
        a = sum(i)
   
        # calls the function to calculate
        # the sum of digits of a
        b = sum(a)
   
        # if the summation is equal to n
        # then increase counter by 1
        if ((i + a + b) == n):
            c += 1
  
    # returns the count
    return c
   
# driver program to test
# the above function
  
n = 9939
       
# calls the function
# to get the answer
print(count(n))
  
# This code is contributed
# by Anant Agarwal.


C#
// C# program to count numbers
// satisfying equation.
using System;
  
class GFG {
      
    // function that returns sum  
    // of digits in a number
    static int sum(int n)
    {
        int rem = 0;
      
        // initially sum of 
        // digits is 0
        int sum_of_digits = 0;
      
        // loop runs till all digits 
        // have been extracted
        while (n > 0)
        {
            // last digit from
            // backside
            rem = n % 10;
      
            // sums up the digits
            sum_of_digits += rem;
      
            // the number is reduced 
            // to the number removing
            // the last digit
            n = n / 10;
        }
          
        // returns the sum of 
        // digits in a number
        return sum_of_digits;
    }
      
    // function to calculate the 
    // count of such occurrences
    static int count(int n)
    {
          
        // counter to calculate 
        // the occurrences
        int c = 0;
      
        // loop to traverse from n-97 to n
        for (int i = n - 97; i <= n; i++)
        {
      
            // calls the function to calculate 
            // the sum of digits of i
            int a = sum(i);
      
            // calls the function to calculate
            // the sum of digits of a
            int b = sum(a);
      
            // if the summation is equal to n
            // then increase counter by 1
            if ((i + a + b) == n) 
            {
                c += 1;
            }
        }
          
        // returns the count
        return c;
    }
  
    // Driver Code
    public static void Main () 
    {
        int n = 9939;
          
        // calling the function
        Console.Write ( count(n) );
      
    }
}
  
// This code is contributed by Nitin Mittal.


PHP
 0) 
    {
      
        // last digit from backside
        $rem = $n % 10;
  
        // sums up the digits
        $sum_of_digits += $rem;
  
        // the number is reduced to the
        // number removing the last digit
        $n = $n / 10;
    }
      
    // returns the sum of
    // digits in a number
    return $sum_of_digits;
}
  
// function to calculate the 
// count of such occurrences
function countt($n)
{
      
    // counter to calculate
    // the occurrences
    $c = 0;
  
    // loop to traverse 
    // from n-97 to n
    for ($i = $n - 97; $i <= $n; $i++)
    {
  
        // calls the function to calculate 
        // the sum of digits of i
        $a = sum($i);
  
        // calls the function to calculate
        // the sum of digits of a
        $b = sum($a);
  
        // if the summation is equal to n
        // then increase counter by 1
        if (($i + $a + $b) == $n)
        {
            $c += 1;
        }
    }
      
    // returns the count
    return $c;
}
  
    // Driver Code
    $n = 9939;
      
    // calls the function 
    // to get the answer
    echo countt($n) ;
  
//This code is contributed by nitin mittal.
?>


输出:

4