贴上代码:
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);
说在最后的话
我不是原创,只是大自然搬运工,有幸在哔哩哔哩上看到解决思路。此处引用其思路,感谢作者。