题解 | #质数因子#
质数因子
https://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static List<Integer> list=new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int a = in.nextInt();
getPrimer(a);
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
if(i<list.size()-1){
System.out.print(" ");
}
}
}
public static void getPrimer(int a){
for(int i=2;a>1;){
if(i>Math.sqrt((double)a)){
list.add(a);
break;
}
if(a%i==0){
list.add(i);
a=a/i;
}else{
i++;
}
}
}
}
超时问题的关键在于某些质数根本没有因子,所以必须要一直计数到这个质数本身,如果质数本身就很大,就会导致超时。
这时候无非有两种方法缩短时间,一个是放大因子,另一个就是缩短质数。
放大因子的思路:
计数不必再从2重新开始,因为计数本身就是从小到大开始的,那些小于当前数的整数没必要再重新遍历。
此思路只能减少起始的几个数,如果质数整体很大,依然超时。
缩短质数的思路:
这里需要利用质数的算术平方根性质,如果一个质数能被整除,那么必然会出现一对整数。这两个整数必然一个大于等于质数的平方根,另一个小于等于质数的平方根。
所以我们可以直接让因子累计到算术平方根为止,因为当你遍历完小于等于算术平方根的整数发现还不能整除时,必然不可能出现大于等于的算术平方根的整除数。
借鉴了其他大佬的思路,补充了一下为什么使用算术平方根的原理。


三奇智元机器人科技有限公司公司福利 81人发布