题解 | #质数因子#

质数因子

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

import java.util.ArrayList;
import java.util.Scanner;
public class Main {
     public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int num = scanner.nextInt();
            if (num >1 ){
               ArrayList arrayList = new ArrayList();
                arrayList = getPrimeFactors(num,arrayList);
                StringBuffer stringBuffer = new StringBuffer();
                for (int i = 0; i < arrayList.size(); i++) {
                    stringBuffer.append(arrayList.get(i)).append(" ");
                }
                System.out.println(stringBuffer.toString().trim());
            }
        }
    }
    private static ArrayList getPrimeFactors(int num,ArrayList arrayList) {
            ArrayList primes = getPrimes(num);
            for (int i = 0; i < primes.size(); i++) {
                Integer integer = primes.get(i);
                if (num % integer == 0){
                    arrayList.add(integer);
                    num = num/integer;
                    if (num != 1){
                        // 使用递归的方式实现短除法
                        getPrimeFactors(num,arrayList);
                        // 递归出口,否则死循环会造成栈溢出
                        break;
                    }else
                        return arrayList;
                }
            }
            return arrayList;
    }
    private static ArrayList getPrimes(int num) {
        ArrayList arrayList = new ArrayList();
        boolean flag = ifPrimeNumber(num);
        if (flag){
            arrayList.add(num);
        }else{
            for (int i = 2; i <= Math.sqrt(num); i++) {
                if (num % i == 0 && ifPrimeNumber(i)){
                    arrayList.add(i);
                }
            }
        }
        return arrayList;
    }
    private static boolean ifPrimeNumber(int num) {
        boolean flag = true;
        if (num == 2 ) return true;
        else {
            for (int i = 2; i <= Math.sqrt(num); i++) {
                if (num % i ==0){
                    flag = false;
                    break;
                }
            }
        }
        return flag;
    }
}

解题思路是:先判断输入的num是否为素数,如果不是素数,则保存所有能整除它的质数,如果是素数,保存自身即可。然后使用短除法,求出符合题意的质数因子。短除法使用递归的方式实现,后接break的作用是及时退出递归,因为层层递归的目的只是为了保存质数因子,保存后即可退出,不需要再执行外层递归,不然外层递归因没有终止条件将一直执行,直到栈溢出。当使用短除法求得num为1时,说明所有质数因子已经找完,直接返回保存的质数因子。

#力扣刷题#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 12:10
点赞 评论 收藏
分享
06-18 08:36
湖南大学 Java
运营你豪哥:没啥拷打的 1.增加量化结果,现在有点缺效果数据 2.突出复杂性,现在的项目描述有点像功能清单,强调一下技术难点和解决方案。
不给转正的实习,你还去吗
点赞 评论 收藏
分享
06-11 17:39
门头沟学院 Java
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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