贴上代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long num = sc.nextLong();
        long k = (long) Math.sqrt(num);
        for (int i = 2; i <= k; i++) {
            if (num % i == 0) { // 如果能整除则表示当前为一个因子
                System.out.print(i + " ");
                num /= i; // num缩小为上一个因子i的倍数。
                k = (long) Math.sqrt(num);
                i = 1;
            }
        }
        // 有可能 上面的循环 num = 2; num /= 2 ==> 1 所以考虑1的情况,如果计算到其它的质子数时,直接出
        System.out.println(num == 1 ? "" : num);
    }
}

解决思路:

1.首先获取输入的整数num

Scanner sc = new Scanner(System.in);
long num = sc.nextLong();

2.计算出num开根值(Math.sqrt(num))== k;

long k = (long) Math.sqrt(num);

3.通过上面的计算,缩小了取数范围为:[2,k]

for (int i = 2; i <= k; i++) 

4.如果 num 能整除 i,则说明当前i为质因子。(注意:这里犯了一个SB错误,那就是想着一个数不能被2整除,能被4整除的可能,其实如果能被4整除,那么一定就能被2整除)

if (num % i == 0)

整除后需要重新计算,num、k和i值。

num = num / i;
k = (long) Math.sqrt(num);
i = 1;

5.求完了所有的质因子后,需要将最后一个质因子打印出来。说明:此处分两种情况,1.如果num已经计算为2了,那么会进入if语句中执行 num /= i; 此时 num=1,所以最后要考虑为1的情况不打印。 2.如果最后计算出num不等于2,比如为3,那么3%2不等于0,且 sqrt(3) = 2; i<=2,是不进入if方法体的,不会打印3的情况。因此需要最后判断下。

System.out.println(num == 1 ? "" : num);

说在最后的话

我不是原创,只是大自然搬运工,有幸在哔哩哔哩上看到解决思路。此处引用其思路,感谢作者。

https://www.bilibili.com/video/BV1DF411W7MB?from=search&seid=16183166778609254722&spm_id_from=333.337.0.0