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

Java多整数GCD计算代码输出错误,输入5,10,15,20,25得1求修复

修复多整数最大公约数(GCD)计算的Java代码错误

问题根源

你的代码核心问题出在gcd方法的循环条件上:

for (int i = 2; i < minNum; i++) {

当输入的最小数是5时,循环只会遍历到i=4,不会检查5本身。而5恰好是这组数字的公约数,因此程序无法识别它,最终返回初始值1。

另外还有潜在问题:如果输入包含负数,minNum会是负数,取模运算会出现异常结果,需要额外处理。

修复方案

方案1:修正循环条件(兼容原逻辑)

把循环条件改为i <= minNum,同时增加绝对值处理负数输入,优化内层循环效率:

import java.util.Scanner;
public class Chapter7_7_14 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] numsToFind = new int[5];
        System.out.println("Please enter 5 numbers now to find their GCD:");

        for (int i = 0; i < numsToFind.length; i++) {
            numsToFind[i] = input.nextInt();
        }

        System.out.println("The GCD of these 5 integers is " + gcd(numsToFind));
    }

    public static int gcd(int... numbers) {
        // 取绝对值避免负数干扰
        int minNum = Math.abs(numbers[0]);
        for (int i = 1; i < numbers.length; i++) {
            int currentAbs = Math.abs(numbers[i]);
            if (currentAbs < minNum) {
                minNum = currentAbs;
            }
        }

        int gcd = 1;
        boolean checkNum;

        // 修正循环条件,包含最小数本身
        for (int i = 2; i <= minNum; i++) {
            checkNum = true;
            for (int j = 0; j < numbers.length; j++) {
                if (Math.abs(numbers[j]) % i != 0) {
                    checkNum = false;
                    // 发现不整除直接跳出,减少无效计算
                    break;
                }
            }
            if (checkNum) {
                gcd = i;
            }
        }
        return gcd;
    }
}

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

遍历找公约数的方法在数字较大时效率偏低,更优的方式是利用欧几里得算法逐步计算多数字的GCD:

import java.util.Scanner;
public class Chapter7_7_14 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] numsToFind = new int[5];
        System.out.println("Please enter 5 numbers now to find their GCD:");

        for (int i = 0; i < numsToFind.length; i++) {
            numsToFind[i] = input.nextInt();
        }

        System.out.println("The GCD of these 5 integers is " + gcd(numsToFind));
    }

    // 计算两个数的GCD
    private static int gcdTwo(int a, int b) {
        a = Math.abs(a);
        b = Math.abs(b);
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    // 扩展为多数字GCD计算
    public static int gcd(int... numbers) {
        int result = numbers[0];
        for (int num : numbers) {
            result = gcdTwo(result, num);
            // 若中途GCD变为1,可直接返回,无需继续计算
            if (result == 1) {
                return 1;
            }
        }
        return result;
    }
}

这种方法优势:

  • 时间复杂度更低,适合大数场景
  • 天然支持负数输入
  • 逻辑简洁,不易出错

测试验证

输入5、10、15、20、25时,两种修复方案都会正确返回5。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:30:57