(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; } } } }
此方法通过了华为的机试。

浙公网安备 33010602011771号