📜  查询以打印数字的所有除数

📅  最后修改于: 2021-05-04 12:51:38             🧑  作者: Mango

给定正整数“ n”并查询“ q”。打印数字“ n”的所有除数。

Input: 6
Output: 1 2 3 6
Explanation
Divisors of 6 are: 1, 2, 3, 6

Input: 10
Output: 1 2 5 10

天真的方法是对每个查询“ q”迭代1到sqrt(n)并相应地打印除数。查看此内容以了解更多信息。这种方法的时间复杂度是q * sqrt(n),不足以进行大量查询。

高效的方法是使用基于筛的方法进行因式分解。

  • 创建一个从1到’n’的连续整数列表。
  • 对于任何数字“ d”,迭代“ d”的所有倍数,即d,2d,3d,…等。同时按除数的倍数“ d”。
    // C++ program to print divisors of
    // number for multiple query
    #include 
    #include 
    using namespace std;
      
    const int MAX = 1e5;
      
    // Initialize global divisor vector
    // array of sequence container
    vector divisor[MAX + 1];
      
    // Sieve based approach to pre-
    // calculate all divisors of number
    void sieve()
    {
        for (int i = 1; i <= MAX; ++i) {
            for (int j = i; j <= MAX; j += i)
                divisor[j].push_back(i);
        }
    }
      
    // Utility function to print divisors
    // of given number
    inline void printDivisor(int& n)
    {
        for (auto& div : divisor[n])
            cout << div << " ";
    }
      
    // Driver code
    int main()
    {
        sieve();
      
        int n = 10;
        cout << "Divisors of " << n << " = ";
        printDivisor(n);
      
        n = 30;
        cout << "\nDivisors of " << n << " = ";
        printDivisor(n);
        return 0;
    }
    
    Output 
    Divisors of 10 = 1 2 5 10 
    Divisors of 30 = 1 2 3 5 6 10 15 303
    

    时间复杂度:每个查询为O(len),其中len等于数字“ n”的总除数。
    辅助空间: O(MAX)