📜  计算与n至少有一位相同的n的除数

📅  最后修改于: 2021-04-26 10:08:50             🧑  作者: Mango

给定数字n,请找出其小数表示形式中至少一位与数字n匹配的除数的数量。

例子:

Input : n = 10
Output: 2
Explanation: numbers are 1 and 10, 1 and 10 
both have a nimbus of 1 digit common with n = 10.

Input : n = 15 
Output: 3 
Explanation: the numbers are 1, 5, 15, all of them
have a minimum of 1 digit common. 

天真的方法是从1迭代到n,并检查所有除数,然后使用散列确定是否有任何数字与n匹配。
时间复杂度:O(n)
辅助空间:O(1)

一种有效的方法是从1迭代到sqrt(n)并检查所有除数i和n / i,如果两者都不同,我们检查i和n / i是否存在匹配项,如果是,我们只需加1答案。我们使用散列来存储是否存在数字。

下面是上述方法的实现

C++
// C++ program to count divisors of n that have at least
// one digit common with n
#include 
using namespace std;
  
// function to return true if any digit of m is 
// present in hash[].
bool isDigitPresent(int m, bool hash[])
{
    // check till last digit
    while (m) {
  
        // if number is also present in original number 
        // then return true
        if (hash[m % 10])
            return true;
        m = m / 10;
    }
  
    // if no number matches then return 1
    return false;
}
  
// Count the no of divisors that have at least 1 digits
// same
int countDivisibles(int n)
{
    // Store digits present in n in a hash[]
    bool hash[10] = { 0 };
    int m = n; 
    while (m) {
  
        // marks that the number is present
        hash[m % 10] = true; 
  
        // last digit removed 
        m = m / 10; 
    }
  
    // loop to traverse from 1 to sqrt(n) to 
    // count divisors
    int ans = 0;
    for (int i = 1; i <= sqrt(n); i++) {
  
        // if i is the factor
        if (n % i == 0) {
  
            // call the function to check if any
            // digits match or not
            if (isDigitPresent(i, hash))
                ans++;
  
            if (n / i != i) {
  
                // if n/i != i then a different number, 
                // then check it also
                if (isDigitPresent(n/i, hash))
                ans++;
            }
        }
    }
  
    // return the answer
    return ans;
}
  
// driver program to test the above function
int main()
{
    int n = 15;
    cout << countDivisibles(n);
    return 0;
}


Java
// Java program to count divisors of n that 
// have at least one digit common with n
class GFG {
      
    // function to return true if any digit
    // of m is present in hash[].
    static boolean isDigitPresent(int m, 
                            boolean hash[])
    {
          
        // check till last digit
        while (m > 0) {
      
            // if number is also present 
            // in original number then 
            // return true
            if (hash[m % 10])
                return true;
            m = m / 10;
        }
      
        // if no number matches then 
        // return 1
        return false;
    }
      
    // Count the no of divisors that 
    // have at least 1 digits same
    static int countDivisibles(int n)
    {
          
        // Store digits present in n 
        // in a hash[]
        boolean hash[] = new boolean[10];
        int m = n; 
        while (m > 0) {
      
            // marks that the number 
            // is present
            hash[m % 10] = true; 
      
            // last digit removed 
            m = m / 10; 
        }
      
        // loop to traverse from 1 to
        // sqrt(n) to count divisors
        int ans = 0;
        for (int i = 1; i <= Math.sqrt(n);
                                    i++)
        {
      
            // if i is the factor
            if (n % i == 0) {
      
                // call the function to 
                // check if any digits 
                // match or not
                if (isDigitPresent(i, hash))
                    ans++;
      
                if (n / i != i) {
      
                    // if n/i != i then a 
                    // different number, 
                    // then check it also
                    if (isDigitPresent(n/i, hash))
                        ans++;
                }
            }
        }
      
        // return the answer
        return ans;
    }
      
    //driver code
    public static void main (String[] args)
    {
        int n = 15;
          
        System.out.print(countDivisibles(n));
    }
}
  
// This code is contributed by Anant Agarwal.


Python3
# Python3 program to count divisors
# of n that have at least
# one digit common with n
import math
  
# Function to return true if any  
# digit of m is present in hash[].
def isDigitPresent(m, Hash):
  
    # check till last digit
    while (m): 
  
        # if number is also present in original  
        # number then return true
        if (Hash[m % 10]):
            return True
        m = m // 10
  
    # if no number matches then return 1
    return False
  
# Count the no of divisors that 
# have at least 1 digits same
def countDivisibles(n):
  
    # Store digits present in n in a hash[]
    Hash = [False for i in range(10)]
    m = n
    while (m): 
  
        # marks that the number is present
        Hash[m % 10] = True
  
        # last digit removed 
        m = m // 10
      
  
    # loop to traverse from 1 to sqrt(n) to 
    # count divisors
    ans = 0
    for i in range(1, int(math.sqrt(n)) + 1): 
  
        # if i is the factor
        if (n % i == 0): 
  
            # call the function to check if any
            # digits match or not
            if (isDigitPresent(i, Hash)):
                ans += 1
  
            if (n // i != i): 
  
                # if n/i != i then a different number, 
                # then check it also
                if (isDigitPresent(n // i, Hash)):
                    ans += 1
  
    # return the answer
    return ans
  
# Driver Code
n = 15
print(countDivisibles(n))
  
# This code is contributed by Anant Agarwal.


C#
// Program to count divisors of
// n that have at least one digit
// common with n
using System;
  
class GFG {
  
    // function to return true if
    // any digit of m is present
    // in hash[].
    static bool isDigitPresent(int m, bool[] hash)
    {
        // check till last digit
        while (m > 0) {
  
            // if number is also present in the
            // original number then return true
            if (hash[m % 10])
                return true;
            m = m / 10;
        }
  
        // if no number matches then return 1
        return false;
    }
  
    // Count the no of divisors that have
    // at least 1 digits same
    static int countDivisibles(int n)
    {
        // Store digits present in n in a hash[]
        bool[] hash = new bool[10];
        int m = n;
        while (m > 0) {
  
            // marks that the number is present
            hash[m % 10] = true;
  
            // last digit removed
            m = m / 10;
        }
  
        // loop to traverse from 1 to sqrt(n) to
        // count divisors
        int ans = 0;
        for (int i = 1; i <= Math.Sqrt(n); i++) {
  
            // if i is the factor
            if (n % i == 0) {
  
                // call the function to check if any
                // digits match or not
                if (isDigitPresent(i, hash))
                    ans++;
  
                if (n / i != i) {
  
                    // if n/i != i then a different number,
                    // then check it also
                    if (isDigitPresent(n / i, hash))
                        ans++;
                }
            }
        }
  
        // return the answer
        return ans;
    }
  
    // Driver code
    public static void Main()
    {
        int n = 15;
        Console.Write(countDivisibles(n));
    }
}
  
// This code is contributed by Anant Agarwal.


PHP


输出:

3

时间复杂度: O(sqrt n)
辅助空间: O(1)