package com.cjh.lanqiao;
public class Main28 {
public static void main(String[] args) {
//2024最大的质因数
//首先ans是质数,其次要是2024的因数
int num = 2024;
int maxPrimeFactor = 1;
// 先处理因数2
while (num % 2 == 0) {
maxPrimeFactor = 2;
num /= 2;
}
// 处理其他奇数因数
for (int i = 3; i <= Math.sqrt(num); i += 2) {
while (num % i == 0) {
maxPrimeFactor = i;
num /= i;
}
}
// 如果最后num大于2,说明它本身就是一个大于2的质因数
if (num > 2) {
maxPrimeFactor = num;
}
System.out.println(maxPrimeFactor);
}
}
2 是质数,此代码块持续将 num 除以 2,直至 num 不能被 2 整除。在此过程中,每次都把 maxPrimeFactor 更新为 2,这就保证了如果 2 是 num 的因数,那么 2 会作为一个质因数被记录。
外层 for 循环从 3 开始,以步长 2 遍历奇数,直到 i 大于 num 的平方根。这里的关键在于,当 num 能被 i 整除时,就把 num 除以 i,直到 num 不能再被 i 整除。
假设 i 不是质数,那它必然可以分解成更小的因数。但由于代码是从小到大遍历因数的,在遇到 i 之前,那些更小的因数就已经把 num 中包含它们的部分除掉了,所以能整除 num 的 i 一定是质数。例如,若 i = 9(非质数),因为 9 能分解成 3×3,在遇到 9 之前,3 就已经把 num 中包含 3 的因数都除掉了,所以 9 不可能再整除 num。