0

在为 Java 中的钻石问题求解器进行了一些激烈的谷歌搜索之后,我能找到的只是 OOP 钻石问题。那不是我所追求的。我正在寻找的是java中的一个简单函数来找到钻石问题的解决方案。

钻石问题可以这样表达:

A = C * D,

B = C + D

因此,如果:

A = 10, B = 7

C = 5,D = 2

我正在尝试做的是快速有效地解决java中的钻石问题。我尝试过嵌套 for 循环,但由于程序的性质,它们的效率极低。

如果有人有任何想法,我很想听听他们的意见。

谢谢!

4

3 回答 3

2

这只是一对联立方程,无需借助数字运算即可解析求解。

重新排列第二行以获取C = B - D并替换到第一行。这给出了 的二次方D

A = D * (B - D)

通过二次公式,我们有一对解D

D = (B +/- sqrt(B^2 - 4*A)) / 2

现在将这些解代入第 2 行以求解C.

于 2012-11-08T21:51:01.113 回答
1

如果我们观察以下代数:

B^2 - 4A = (C^2 + 2CD + C^2) - 4CD = (C^2 - 2CD + D^2) = (C-D)^2

然后我们可以快速轻松地制作这个函数:

public static double[] diamondSolve(double a, double b) {
    double temp = b * b - 4 * a;
    double difference = Math.sqrt(temp); // difference = C - D

    double[] retArray = new double[2];

    // (b + difference) / 2 = (C + D + C - D) / 2 = 2C / 2 = C
    retArray[0] = (b + difference) / 2;

    // B - C = C + D - C  = D
    retArray[1] = b - retArray[0];

    return retArray;
}

顺便说一句,如果4A大于B^2...,这将产生问题,在这种情况下,答案无论如何都是虚构的。

于 2012-11-08T22:01:27.540 回答
0

我懒得为你做代数,但只要解决cdab

所以像

`C = A + B/A`

disclimer,我只是把上面的表达方式做了,但同样的概念也随之而来。你可以做你自己的代数。

也许你可以根据你知道的值做某种 switch 语句。有 4 选择 2(就像 6)不同的情况

于 2012-11-08T21:45:09.137 回答