2016-03-08 160 views
0

我正在閱讀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)); 
    } 
+0

如果判別式爲負數或a == 0,則不適用。這是一個天真的實現,不會考慮特殊情況(a == 0,b == 0,c == 0)。 – duffymo

+0

@duffymo感謝您的反饋,你可以闡述你的想法?你有替代解決方案嗎? – dcrearer

+0

是的,通過我提到的三個案例中的每一個,看看它是如何改變解決方案的。例如,如果b = 0,則有兩個解:+/- sqrt(c/a)。如果a = 0,那麼只有一個解決方案:-c/b。如果c = 0,則有兩個解:0和-b/a。如果判別式爲負,則兩個解是複數,彼此的共軛。你應該考慮所有這些。 – duffymo

回答

4

不,筆者可能以不同方式來實現該算法。假設一般情況下,a不能取消,因爲-b因子不包含a。

公式找到一元二次方程的根是: -

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

我建議你去通過常用的方式。如果作者使用了不同的約定,那麼請不要這樣做。

請按照標準/通用的方式。這很容易理解。

根據反饋...請問下面是正確的解決方案:..

您添加的問題作爲一個編輯卻是正確的解決方案。所以,我建議你這樣做。

+0

你可以看看我的編輯並提供一些想法。 – dcrearer

+0

這是不正確的。作者已經從等式中取消了它,而不是從二次方根的公式中刪除。你能否修改你的答案,因爲它似乎是被接受的答案? – user1952500

+0

@ user1952500 - SORRY,它是正確的/標準的公式。這不可能是錯的。接下來,我沒有這本書。我怎麼能說出作者取消了什麼?讓OP遵循標準的公式方法。謝謝你的觀點。 –

3

我認爲作者們假設某個歸一化,其中,所述二次方程式的首項係數爲1。

所以,舉例來說:

 
2x2 + 4x + 8 = 0 

將表示爲

 
x2 + 2x + 4 = 0 

這兩個方程都是相同的,只不過它已經被標準化了,可以這麼說。