You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 13:36:06