# 解一元二次
#### 以下題目皆來自 https://zerojudge.tw/ 的題庫
###### tags: `java撰寫練習`
---
題目:求一元二次方程式 ax2+bx+c=0 的根
每組輸入共一行,內含三個整數 a, b, c 以空白隔開。
已知條件:
答案均為整數,若有兩個根則大者在前
必須要用特殊格是顯示出
雙異根"Two different roots x1=?? , x2=??"
雙同根"Two same roots x=??"
無實根"No real root"
曾經用過暴力解,試圖想用帶入法解這個題目,但是由於很難在完全不知道數組規則的情況下判斷雙解在拋物線的兩邊、同邊還是根本就沒有解,在嘗試了一陣子之後想想,反正自己也沒有要當數理專家,只要能把問題分解並且解決就是好的工程師,就很乾脆地上網尋求公式的幫助。
X=(-b±sqrt(b^2+4ac))/2a
且(b^2+4ac)>0,則有兩異根
(b^2+4ac)=0,有同根
(b^2+4ac)<0,無實根
使用java.lang.Math包的Math.pow(基數,次方數)求得解。
要注意的是,菜雞們可能會跟我犯一樣的錯誤,沒有好好地注意是不是所有算術順序都正確,像是下方註解的地方我就忘記把括號括上去,導致測試題目都能通過,遇上正式測試檔的時候就出錯了。
```
import java.util.Scanner;
import java.lang.Math;
import static java.lang.System.out;
public class test {
public static void main(String[] args) {
try {
int a,b,c=0;int AWS1,AWS2=0;
Scanner Scan=new Scanner(System.in);
a=Scan.nextInt();
b=Scan.nextInt();
c=Scan.nextInt();
Radical radical=new Radical();
if(a==0)System.out.println("此非二元一次方程式");
AWS1=((b*(-1))+(int)radical.compute(a, b, c))/(2*a);
AWS2=((b*(-1))-(int)radical.compute(a, b, c))/(2*a);//要把所有可能會運算順序錯誤的地方都用括號括起來(如/2*a)
if(AWS1==AWS2)System.out.println("Two same roots x="+AWS1);
else if(AWS1>AWS2)System.out.println("Two different roots x1="+AWS1+" , x2="+AWS2);
Scan.close();
}
catch(ArithmeticException e){System.out.println("No real root");}
}
}
class Radical
{
double answer=0;
double compute(int inputA,int inputB,int inputC) {
if((inputB*inputB)-(4*inputA*inputC)<0) {throw new ArithmeticException("No real root");}
answer = Math.pow((double)((inputB*inputB)-(4*inputA*inputC)),0.5);
return this.answer;
}
}
```