给定正整数“ 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)