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

如何过滤输出仅显示最大公约数?Java代码优化求助

解决方法

你的原代码是通过从1开始枚举的方式找公约数,所以会输出所有符合条件的数。要只输出最大公约数,这里给你两种简单可行的方案:

方案1:优化暴力枚举(从大到小找)

你担心反转循环破坏欧几里得算法逻辑,但其实你的原代码根本没用到欧几里得算法,完全可以放心把遍历方向反过来——从两个数的较小值开始往下找,找到第一个能同时整除两个数的数就是最大公约数,找到后立刻终止循环,这样只会输出一次结果。

修改后的代码:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
     
        System.out.println("Please Enter Your Integer");
        int X = input.nextInt();
        int X1 = input.nextInt();
        
        int gcd = 1;
        int minNum = Math.min(X, X1);
        // 从较小数开始向下遍历
        for(int i = minNum; i >= 1; i--) { 
            if(X % i == 0 && X1 % i == 0) { 
                gcd = i;
                break; // 找到最大公约数后直接退出循环,不用继续找
            }
        }
        System.out.printf("GCD of %d and %d is: %d", X, X1, gcd);  
    }
}

方案2:用欧几里得算法(更高效)

如果想使用欧几里得算法(辗转相除法)——这是计算最大公约数的标准高效方法,代码实现如下:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
     
        System.out.println("Please Enter Your Integer");
        int num1 = input.nextInt();
        int num2 = input.nextInt();
        
        int a = num1;
        int b = num2;
        // 辗转相除核心逻辑
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        System.out.printf("GCD of %d and %d is: %d", num1, num2, a);  
    }
}

额外说明

  • 原代码的问题在于每次找到公约数就打印,且从小到大遍历,所以会输出所有公约数。从大到小遍历找到第一个就停,是暴力法里效率最高的方式。
  • 欧几里得算法的时间复杂度远低于暴力枚举,处理大数时优势特别明显。

内容的提问来源于stack exchange,提问作者Conner Diers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:50:21