思考问题
为什么寻找因数只需要遍历到√n(n的平方根)就可以找到所有因数?
对于任意整数 n,如果 d 是 n 的因数
那么存在整数 q 满足:n = d × q
此时 d 和 q 都是 n 的因数
并且 d 和 q 满足关系:d ≤ √n 或 q ≤ √n
原理证明
假设 d 是 n 的一个因数,那么 n = d × q,其中 q 也是 n 的因数。此时有三种情况:
d
×
q
=
n
当 d < q 时:d 一定小于 √n,因为如果 d > √n 且 q > √n,则 d×q > n
当 d > q 时:q 一定小于 √n
当 d = q 时:d = q = √n,此时 n 是完全平方数
小因数
≤
√n
≤
大因数
结论
通过遍历从 1 到 √n 的所有整数,我们可以找到所有小于或等于 √n 的因数 d,同时通过计算 n/d 得到对应的较大因数 q。这样就能找到 n 的所有因数对,而无需遍历到 n 本身。
这种优化方法将时间复杂度从 O(n) 降低到 O(√n),对于大数(如 10^12)效率提升非常显著:从 10^12 次操作减少到约 10^6 次操作。