从i = 2开始遍历的时候,使用如下两个方法对代码进行优化:
一个正整数的质因子,最多只有一个大于其平方根。
证明:假设有超过一个质因子大于其平方根,那么二者相乘一定大于该数。得证。
如果找到一个质因子,那么该质因子的2倍、3倍...都不是质因子。
#include <bits stdc++.h>
using namespace std;
//constexpr long long N = 1e10 + 10;
//bool st[N];
unordered_map<long, bool> st;
inline void solve(long &n)
{
for (long i = 2; i <= (long)sqrt(n); i++) {
for (;!st[i] && n % i == 0;) {
cout << i << ' ';
n /= i;
for (long j = i + i; j <= (long)sqrt(n); j += i)
st[j] = true;
}
}
if (n != 1) cout << n << ' ' << endl;
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
long n;
for (; cin >> n; st = {})
solve(n);
return 0;
} 注意
如果存在一个质因子比原 n 的开方大,那么最后一次执行 n /= i后,i 超过 sqrt(n)退出循环,此时的 n 一定是原 n 的约数,且如果他不是1的话,一定是个质数。</long,>

京公网安备 11010502036488号