实现二次算法

时间:2016-03-08 17:30:19

标签: java algorithm math quadratic coefficients

我正在阅读Robert Sedgewick和Kevin Wayne的介绍性编程书。

在其中一个例子中,他们实现了如下的二次类:

public class Quadratic
{
    public static void main(String[] args)
    {
        double b = Double.parseDouble(args[0]);
        double c = Double.parseDouble(args[1]);
        double discriminant = b * b - 4.0 * c;
        double d = Math.sqrt(discriminant);
        System.out.println((-b + d) / 2.0);
        System.out.println((-b - d) / 2.0);
    }
}

作者省略了二次公式的'a'系数。这是因为'a'系数可以被取消(分子/分母)?

根据反馈......以下是正确的解决方案:

public static void main(String[] args)
    {
        double b = Double.parseDouble(args[0]);
        double c = Double.parseDouble(args[1]);
        double a = Double.parseDouble(args[2]);
        double discriminant = b * b - 4.0 * a * c;
        double d = Math.sqrt(discriminant);
        System.out.println((-b + d) / (2.0 * a));
        System.out.println((-b - d) / (2.0 * a));
    }

2 个答案:

答案 0 :(得分:4)

不,作者可能以不同的方式实现了该算法。假设一般情况,a无法取消,因为-b因素不包含a。

查找二次方程根的公式为: -

roots = (-b +(-) sqrt((b^2) - (4*a*c))) / (2*a).
     // here - alongwith + represents how to find second root.

我建议您通过常用的方式。如果作者使用了不同的约定,那么请不要这样做。

请遵循标准/通用方式。这很容易理解。

  

根据反馈......以下是正确的解决方案:..

您作为编辑添加到问题中的解决方案似乎正确无误。所以,我建议你这样做。

答案 1 :(得分:3)

我认为作者假定某种归一化,其中二次方程的前导系数是1.

所以,例如:

2x2 + 4x + 8 = 0

将表示为

x2 + 2x + 4 = 0

这些都是相同的等式,它只是一个已经标准化,可以这么说。