题解 | #质数因子#

质数因子

http://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607

题意整理。

  • 输入一个正整数。
  • 按照从小到大的顺序输出所有质因子。

方法一(循环)

1.解题思路

  • 遍历所有可能的质因子。
  • 只要当前数字可以分解,则一直分解下去,并输出过程中产生的质因子。

图解展示: alt

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        long n=sc.nextLong();
        //遍历所有可能的质因子
        for(int i=2;n!=1;i++){
            while(n%i==0){
                n/=i;
                //输出质因子
                System.out.print(i+" ");
            }
        }
    }
}

3.复杂度分析

  • 时间复杂度:最坏的情况下需要遍历n-1次,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)

方法二(缩小范围)

1.解题思路

假设一个数为n,它的平方根为q。如果n能被一个大于q的数整除,记为m(m>q),那么n也一定能被n/m整除,而n/m小于q。所有遍历质因子的时候,只需寻找[2,q]范围内的质因子即可。

其它的地方与方法一大致相同。

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        long n=sc.nextLong();
        //取输入n的平方根
        long q=(long)Math.sqrt(n);
        //遍历所有可能的质数因子
        for(int i=2;i<=q;i++){
            //因为是从最小的因子开始分解质因子,所以不会存在分解出合数的情况
            while(n%i==0){
                n/=i;
                System.out.print(i+" ");
            }
        }
        //如果最后不为1,说明剩下的是一个质数,直接输出
        if(n!=1){
            System.out.print(n+" ");
        }
    }
}

3.复杂度分析

  • 时间复杂度:最坏的情况下需要遍历n1\sqrt{n}-1次,所以时间复杂度为O(n)O(\sqrt{n})
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)
xqxls的题解 文章被收录于专栏

牛客题解

全部评论
兴高采烈的看懂了第一种,完了运行结果超时了...
点赞 回复 分享
发布于 2022-06-10 15:44
第二个结论是怎么得出的啊,我就发现这种题的优化方式很奇怪,都会想到一些没听过的定理
点赞 回复 分享
发布于 2022-05-03 22:40

相关推荐

合适才能收到offe...:招聘上写这些态度傲慢的就别继续招呼了,你会发现hr和面试官挺神的,本来求职艰难就可能影响一些心态了,你去这种公司面试的话,整个心态会炸的。
点赞 评论 收藏
分享
03-05 17:03
已编辑
浙江工商大学 C++
陈好好wy:整体看下来有点空空的感觉,可以把每一段项目经历都再完善一下,然后用小标题的形式写个两到三条,目前看有点太简单了,不太能看出具体在这个项目里做了什么工作。还是要尽量把自己做的工作以量化的形式体现在简历上呢。
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
6
2
分享

创作者周榜

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