文章目录
1. 分解质因数+模板
思路:
- 暴力枚举:从小到大枚举 n n n 的所有约数,如果 n % i = = 0 n \% i == 0 n%i==0 则除尽求出该因子的次数。时间复杂度 O ( n ) O(n) O(n)。
- 算法优化: n n n 中最多只包含一个大于 n \sqrt n n 的质因子。如果枚举结束, n n n 还大于 1 ,那么说明这就是那个大于 n \sqrt n n 的质因子。时间复杂度 O ( n ) O(\sqrt n) O(n)。
这里分解质因数和试除法判定质数,虽然时间复杂度理论上都是 O ( n ) O(\sqrt n) O(n),但是意义却不同:
- 试除法一定会循环 O ( n ) O(\sqrt n) O(n) 次
- 然而分解质因数最好时间复杂度为 O ( l o g n ) O(logn) O(logn),最坏为 O ( n ) O(\sqrt n) O(n),因为如果 n n n 为 2 k 2^k 2k 时,循环 k k k 次直接结束。
模板代码:
#include <iostream>
#include <algorithm>
using namespace std;
int m;
void divide(int n) {
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0) {
int s = 0;
while (n % i == 0) {
s ++;
n /= i;
}
cout << i << ' ' << s << endl;
}
}
if (n > 1) cout << n << ' ' << 1 << endl;
cout << endl;
}
int main() {
cin >> m;
while (m --) {
int n;
cin >> n;
divide(n);
}
return 0;
}