第 1 步:从小到大试除。从 2 开始:n 能被 i 整除,就一直除、数次数 e,记下"i 出现 e 次";i 加 1 继续。只需试到 i × i ≤ n。
第 2 步:处理剩下的。循环结束后如果 n 还大于 1,剩下的这个数本身就是质数(最大的质因子),补记"出现 1 次"。
第 3 步:配方在手,约数个数直接算。把每个质因子的"指数 + 1"相乘,就是约数个数。
为什么试到 √n 就够?如果 n 还有合数因子,它必然有一个 ≤ 它的平方根的质因子,早就被试掉了。剩下的 > 1 的部分只可能是质数。
💻 C++ 怎么写
// 试除分解 + 数约数个数(以 n = 60 为例)
int main() {
int n; cin >> n;
int m = n, divCnt = 1;
for (int i = 2; i * i <= m; i++) {
if (m % i == 0) {
int e = 0;
while (m % i == 0) { m /= i; e++; }
cout << i << " 出现 " << e << " 次\n";
divCnt *= (e + 1); // 约数个数:指数+1 相乘
}
}
if (m > 1) { // 剩下的就是质因子
cout << m << " 出现 1 次\n";
divCnt *= 2;
}
cout << "约数个数: " << divCnt << endl; // 12
return 0;
}
考点提醒:① 循环条件用 i * i <= m,注意 m 在变小,不用试到原数;② m > 1 的剩余因子别忘了补上;③ 求约数个数是 (e+1) 相乘,不是相加。