题解 | #质数因子#

质数因子

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时,说明所有质数因子已经找完,直接返回保存的质数因子。

#力扣刷题#
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务