0

Robert Sedgewick と Kevin Wayne によるプログラミング入門書を読んでいます。

例の1つでは、次のように二次クラスを実装しています。

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));
    }
4

2 に答える 2

4

いいえ、作成者はそのアルゴリズムを別の方法で実装した可能性があります。一般的なケースを想定すると、因子がaで構成されていaないため、キャンセルできません。-b

二次方程式の根を見つける式は次のとおりです。

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

一般的な方法で行くことをお勧めします。作成者が異なる規則を使用している場合は、それに従わないでください。

標準/共通の方法に従ってください。分かりやすいです。

フィードバックに基づいて… 以下が正しい解決策でしょうか:..

編集として質問に追加した解決策は正しく表示されます。ですから、その通りに行くことをお勧めします。

于 2016-03-08T17:32:34.427 に答える
3

著者は、二次方程式の主係数が 1 である特定の正規化を想定していると思います。

たとえば、次のようになります。

2x 2 + 4x + 8 = 0

として表されます

x 2 + 2x + 4 = 0

これらはどちらも同じ方程式です。いわば一方が正規化されているだけです。

于 2016-03-08T17:33:27.227 に答える