题目解析四:正整数 X 的求解| 豆包MarsCode AI刷题

150 阅读4分钟

正整数 X 的求解问题及实现分析

在日常开发和算法题中,经常会遇到数学推导与编程结合的场景。这道问题的核心是根据给定条件,寻找一个正整数 XX 满足以下两个等式:

  1. A=B×XA = B \times X
  2. C=D×XC = D \times X

如果不存在这样的 XX,需要返回 -1。

这是一道简单却非常经典的数学编程题,涉及到除法、求余和条件判断,能够考察程序的边界处理和算法设计能力。以下是对问题的完整解析和个人思考。


问题分解

条件分析

  1. 倍数关系:从公式可以推导出,XX 的求解依赖 AA 和 CC 是否可以分别被 BB 和 DD 整除。
  2. 唯一性:当且仅当 A/B=C/DA / B = C / D 时,XX 才是唯一确定的。否则,说明无法同时满足两个等式。

这就将问题分解为三个核心判断:

  1. A%B=0A % B = 0:保证 AA 是 BB 的整数倍;
  2. C%D=0C % D = 0:保证 CC 是 DD 的整数倍;
  3. A/B=C/DA / B = C / D:确保两个等式的结果一致。

算法设计

为了满足上述逻辑,我们可以设计以下解决步骤:

  1. 检查整除条件:分别判断 A%BA % B 和 C%DC % D 是否为 0,如果不满足,直接返回 -1。
  2. 计算商值 XX:分别计算 A/BA / B 和 C/DC / D,并比较两者是否相等。如果相等,返回 XX;否则返回 -1。

代码如下:

public class Main {
    public static int solution(int A, int B, int C, int D) {
        // 检查 A 是否能被 B 整除,C 是否能被 D 整除
        if (A % B == 0 && C % D == 0) {
            int X1 = A / B;
            int X2 = C / D;
            // 如果 X1 和 X2 相等,则返回 X,否则返回 -1
            if (X1 == X2) {
                return X1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(solution(4, 2, 6, 3) == 2);  // 输出 2
        System.out.println(solution(8, 4, 15, 5) == -1); // 输出 -1
        System.out.println(solution(9, 3, 12, 4) == 3);  // 输出 3
    }
}

代码解读与优化

逻辑清晰性

  1. 条件判断的分离A % B == 0C % D == 0 是两个独立的条件,逐步判断可以提高代码的可读性。
  2. 商值比较:通过 X1X2 的相等性判断是否满足题意。这一步逻辑简单且高效。

算法复杂度

  • 时间复杂度为 O(1)O(1),因为所有操作仅为常数级计算(求余和除法)。
  • 空间复杂度为 O(1)O(1),不需要额外存储数据。

这种低复杂度的算法在实际开发中非常实用。


边界情况分析

在设计算法时,边界测试尤为重要。以下列出几个关键的测试用例和分析:

  1. 典型用例

    • 输入 A=4,B=2,C=6,D=3A = 4, B = 2, C = 6, D = 3,应返回 X=2X = 2,因为 A/B=2A / B = 2 且 C/D=2C / D = 2。
    • 输入 A=8,B=4,C=15,D=5A = 8, B = 4, C = 15, D = 5,应返回 -1,因为 A/B≠C/DA / B \neq C / D。
  2. 异常用例

    • A%B≠0A % B \neq 0 或 C%D≠0C % D \neq 0:直接返回 -1。例如 A=7,B=3,C=12,D=4A = 7, B = 3, C = 12, D = 4。
    • 边界值:当 A,B,C,DA, B, C, D 中某个值为 1(例如 A=1,B=1A = 1, B = 1),逻辑依然应正常运行。

个人思考与扩展

  1. 可扩展性

    • 问题本身是基于两个等式的约束,如果增加更多条件,比如 E=F×XE = F \times X,可以通过类似逻辑扩展,但需要保证所有商值一致。
    • 更复杂的约束可能需要引入最小公倍数或最大公约数的数学方法进行优化。
  2. 应用场景

    • 这种求解逻辑在实际开发中并不少见。例如,在资源分配、任务分发或比例缩放等问题中,可以通过类似判断解决问题。
    • 另一种场景是分数化简,判断两个分数是否相等本质上也需要类似逻辑。
  3. 更通用的实现

    • 如果问题不仅限定为正整数,可以扩展到浮点数,采用更精确的比较逻辑。
    • 对于大数据规模,可以使用数学库函数避免溢出。

总结

这道问题虽然简单,但它包含了对数学和编程基础知识的考察。通过问题分析、算法设计、边界测试,我们不但解决了问题,还能扩展这一逻辑到更广泛的应用场景。通过不断训练这种思维方式,可以提高解决实际问题的能力。