Java编写获取用户输入数字最大质因数程序,代码问题求助
现有代码存在的问题
- 数组使用逻辑错误:你初始化了长度为
num的数组,但实际存储的有效质因数只有前n位,直接输出数组最后一位会得到默认的初始值0,而非你要的最后一个质因数。同时数组长度设置过大,完全没必要预留和输入数字等长的空间,一个正整数的质因数数量远小于其本身数值。 - 质数判断函数命名与逻辑不符:
checkPrime函数返回false时才代表输入值是质数,命名极易引起逻辑混淆,且判断效率偏低。 - 循环逻辑错误:遍历变量
i从1开始,1不是质数不需要纳入判断;循环终止条件设置为n < PrimeFactors.length会导致i超出输入数值范围后仍在无效遍历,浪费性能。 - 边界情况未处理:如果输入数值小于2,没有对应的处理逻辑会导致数组越界。
优化实现方案
不用存储所有质因数也能得到最大质因数,我们可以用更高效的质因数分解法,不需要单独写质数判断函数,性能和空间占用都远优于原有逻辑:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); sc.close(); // 处理小于2的边界情况 if (num < 2) { System.out.println("无有效质因数"); return; } int maxPrime = 1; // 先把所有2的因数除干净 while (num % 2 == 0) { maxPrime = 2; num /= 2; } // 现在剩下的num是奇数,从3开始遍历到sqrt(num),步长为2减少遍历次数 for (int i = 3; i <= Math.sqrt(num); i += 2) { while (num % i == 0) { maxPrime = i; num /= i; } } // 如果最后剩下的num大于2,说明它本身就是一个质数,也是最大质因数 if (num > 2) { maxPrime = num; } System.out.println(maxPrime); } }
如果你希望保留存储所有质因数的实现逻辑,可以用ArrayList替代普通数组,不需要提前定义长度,支持动态扩容:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); sc.close(); if (num < 2) { System.out.println("无有效质因数"); return; } ArrayList<Integer> primeFactors = new ArrayList<>(); for (int i = 2; i <= num; i++) { if (isPrime(i) && num % i == 0) { primeFactors.add(i); } } // 输出最后一个元素就是最大质因数 System.out.println(primeFactors.get(primeFactors.size() - 1)); } // 修正后的质数判断函数,返回true代表是质数 public static boolean isPrime(int a) { if (a <= 1) return false; if (a == 2) return true; if (a % 2 == 0) return false; for (int i = 3; i <= Math.sqrt(a); i += 2) { if (a % i == 0) { return false; } } return true; } }
内容的提问来源于stack exchange,提问作者Franco_935
相关产品推荐
相关产品推荐

