(Java) 将一个正整数分解质因数

本文参考自:https://blog.csdn.net/cui_yonghua/article/details/93975617,但是链接文章中的方法存在缺陷,本文将在下面进行讨论。

案例:将一个正整数分解质因数。例如:输入 100 : 打印 100 = 2 * 2 * 5 * 5

思路分析:对n进行分解质因数,应先找到一个最小的质数k,可以遵循如下思路:

1. 如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
2. 如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
3. 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

第一种方法:递归

 1 package mytest;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Example {
 6     //n代表需要输入的正整数
 7     static int n,k = 2;
 8 
 9     public static void main(String[] args) {
10         System.out.print("请输入一个大于2的正整数:");
11         Scanner scanner = new Scanner(System.in);
12         int n = scanner.nextInt();
13         System.out.print(n + "=");
14         Example example = new Example();
15         example.findPrimeFactors(n);
16 
17     }
18     public void findPrimeFactors(int n){
19         while (k <= n){
20             if(k == n){
21                 System.out.print(n);
22                 break;
23             }else if(n>k && n%k == 0){
24                 System.out.print(k + "*");
25                 n = n/k;
26                 findPrimeFactors(n);
27                 break;
28             }else if (n>k && n%k != 0){
29                 k++;
30                 findPrimeFactors(n);
31                 break;
32             }
33         }
34     }
35 }

此方法一般情况下是可行的,但是有可能发生内存溢出:

 

 

第二种方法:普通循环

package com.algorithm.java;

import java.util.Scanner;

/**
 *  输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
 * 最后一个数后面也要有空格
 * @author keke
 */
public class PrimeFactors {

        static long k = 2L;

        public static void main(String[] args) {
            System.out.print("请输入一个大于2的正整数:");
            Scanner scanner = new Scanner(System.in);
            long n = scanner.nextLong();
            System.out.println(n + "=");
            findByLoop(n);

        }


    /**
     *  遍历查找
     * @param num
     */
    public static void findByLoop(long num){
            // 此处i 的上界不能为num/2,否则有些数据得不到结果,比如 7
            for (int i = 2 ; i <= num; i ++) {
                if (num % i == 0) {
                    System.out.print(i + " ");
                    num = num / i;
                    // 每次更新i 的值,下次循环时从i 开始,减少不必要的循环
                    i -= 1;
                }
            }

        }

}

此方法通过了华为的机试。

posted @ 2020-06-10 22:27  科哒科哒  阅读(1218)  评论(0)    收藏  举报