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

Java程序查找a/b/c组合等于x时总是输出"Impossible",如何解决?

问题分析与解决方案

原代码的核心问题

你的程序无论是否找到有效组合都会输出"Impossible",根源在于:

  • 你把"Impossible"的判断放在了最内层循环中,仅当i=x、j=x、k=x且当前组合不满足等式时就触发输出——这意味着哪怕前面已经找到过有效组合,最后一轮循环到(x,x,x)时只要不满足条件,还是会打印"Impossible"。
  • 代码里的i == x & j == x误用了单&(按位与运算符),正确写法应为双&&(逻辑与运算符),不过这不是导致问题的关键原因。

修正方案

引入一个布尔标记变量,记录是否找到过有效组合。遍历完所有可能的(i,j,k)组合后,再根据标记判断是否输出"Impossible"。同时可以优化循环上限,避免不必要的无效遍历(比如i的最大取值应为x/a,如果a不为0,否则i*a会超过x)。

修正后的代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int a = input.nextInt();
        int b = input.nextInt();
        int c = input.nextInt();
        int x = input.nextInt();
        // 标记是否找到有效组合
        boolean found = false;

        // 优化循环上限:避免超出x的无效遍历
        int maxI = a == 0 ? x : x / a;
        int maxJ = b == 0 ? x : x / b;
        int maxK = c == 0 ? x : x / c;

        for (int i = 0; i <= maxI; i++) {
            for (int j = 0; j <= maxJ; j++) {
                for (int k = 0; k <= maxK; k++) {
                    if (i * a + j * b + k * c == x) {
                        System.out.println(i + " " + j + " " + k);
                        found = true;
                    }
                }
            }
        }

        // 所有组合遍历完成后,统一判断是否输出Impossible
        if (!found) {
            System.out.println("Impossible");
        }
        input.close();
    }
}

关键改动说明

  1. 标记变量found:初始为false,每找到一个有效组合就设为true,用于全局记录是否存在解。
  2. 循环上限优化:根据a、b、c的取值计算每个变量的最大可能值,减少无意义的循环次数,提升程序效率。
  3. 全局判断逻辑:等所有循环结束后,再检查found的值,只有完全没找到有效组合时才输出"Impossible"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:55:29