package SelfStudy;
import java.util.Scanner;
public class a006SeniorHighAccept {
public static void main(String[] args) {
Scanner inputnums=new Scanner(System.in);
int a , b , c;
while(inputnums.hasNextInt()) {
//讀取下一個單詞,以空格作為分隔符,返回檢測輸入中是否還有其他單詞
a = inputnums.nextInt();
b = inputnums.nextInt();
c = inputnums.nextInt();
double result_sqrt = (int) Math.sqrt(b*b - 4*a*c);
int iresult_sqrt = (int) result_sqrt;
// System.out.println(iresult_sqrt); //顯示出公式裡的根號值
double dX1 = ((-b) + iresult_sqrt) / (2*a);
double dX2 = ((-b) - iresult_sqrt) / (2*a);
int iX1 = (int) dX1;
int iX2 = (int) dX2;
if (iresult_sqrt > 0) {
System.out.println("Two different roots x1=" + (iX1) + " , " + "x2=" + (iX2));
} else if (iresult_sqrt == 0) {
System.out.println("Two same roots x=" + (iX1));
} else {
System.out.println("No real root");
}
}
}
}
Math.sqrt()不會幫你處理虛根,如果你丟了一個負數給它處理,他會回傳NaN。
所以你的 result_sqrt 的值會是NaN
下一行的 int iresult_sqrt = (int)result_sqrt 會變成 (int)NaN = 0
就會判斷成重根
這種情況有2種方法來處理判斷,一種是直接改成不開根號,避開NaN的問題,依照判別式的值 b**2 - 4*a*c 是否小於 0 來判斷
第二種則是判斷 result_sqrt 是否為NaN,如果要這樣寫,必須使用 Double.isNaN() 來判斷
另外 java的變數名稱習慣會用駝峰命名法來命名,_在java裡面習慣用於被宣告為 final 的值上(常量)
Math.sqrt()不會幫你處理虛根,如果你丟了一個負數給它處理,他會回傳NaN。
所以你的 result_sqrt 的值會是NaN
下一行的 int iresult_sqrt = (int)result_sqrt 會變成 (int)NaN = 0
就會判斷成重根
這種情況有2種方法來處理判斷,一種是直接改成不開根號,避開NaN的問題,依照判別式的值 b**2 - 4*a*c 是否小於 0 來判斷
第二種則是判斷 result_sqrt 是否為NaN,如果要這樣寫,必須使用 Double.isNaN() 來判斷
另外 java的變數名稱習慣會用駝峰命名法來命名,_在java裡面習慣用於被宣告為 final 的值上(常量)
使用第一種情況就AC了 謝謝你 推中科大同學 ,不過還是蠻好奇若用Double.isNaN()來判斷的話該怎麼做呢? 剛剛試了完全不行
這是拿你程式碼改的
package SelfStudy;
import java.util.Scanner;
public class a006SeniorHighAccept {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int a, b, c;
while(scn.hasNext()) {
a = scn.nextInt();
b = scn.nextInt();
c = scn.nextInt();
int iresultSqrt = (int) resultSqrt;
int iX1 = (int)((-b) + iresultSqrt) / (2*a);
int iX2 = (int)((-b) - iresultSqrt) / (2*a);
if (Double.isNaN(resultSqrt))
System.out.println("No real root");
else if (iresultSqrt > 0)
System.out.println("Two different roots x1=" + (iX1) + " , " + "x2=" + (iX2));
else
System.out.println("Two same roots x=" + (iX1));
}
}
}
改動的部分主要在後面的if-else和前面的 double resultSqrt = Math.sqrt(b*b - 4*a*c); (我把(int)拿掉了,因為它會把NaN變成0,我前面沒注意到(int)的存在,抱歉...)
這是拿你程式碼改的
package SelfStudy;
import java.util.Scanner;
public class a006SeniorHighAccept {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int a, b, c;
while(scn.hasNext()) {
a = scn.nextInt();
b = scn.nextInt();
c = scn.nextInt();
int iresultSqrt = (int) resultSqrt;
int iX1 = (int)((-b) + iresultSqrt) / (2*a);
int iX2 = (int)((-b) - iresultSqrt) / (2*a);
if (Double.isNaN(resultSqrt))
System.out.println("No real root");
else if (iresultSqrt > 0)
System.out.println("Two different roots x1=" + (iX1) + " , " + "x2=" + (iX2));
else
System.out.println("Two same roots x=" + (iX1));
}
}
}
改動的部分主要在後面的if-else和前面的 double resultSqrt = Math.sqrt(b*b - 4*a*c); (我把(int)拿掉了,因為它會把NaN變成0,我前面沒注意到(int)的存在,抱歉...)
謝謝你!