题解 | #质数因子#

质数因子

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重新开始,因为计数本身就是从小到大开始的,那些小于当前数的整数没必要再重新遍历。

此思路只能减少起始的几个数,如果质数整体很大,依然超时。

缩短质数的思路:

这里需要利用质数的算术平方根性质,如果一个质数能被整除,那么必然会出现一对整数。这两个整数必然一个大于等于质数的平方根,另一个小于等于质数的平方根。

所以我们可以直接让因子累计到算术平方根为止,因为当你遍历完小于等于算术平方根的整数发现还不能整除时,必然不可能出现大于等于的算术平方根的整除数。

借鉴了其他大佬的思路,补充了一下为什么使用算术平方根的原理。

全部评论

相关推荐

一表renzha:你点进去没打招呼他也会有提示的,之前我点进美的,还没打招呼,他马上给我发了不太合适哦
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务