#26680: 80%成功 只差顯示不出來 正確答案為: No real root


jackson199988@gmail.com (jackson)

學校 : 不指定學校
編號 : 160565
來源 : [223.138.166.159]
最後登入時間 :
2021-08-11 02:31:51
a006. 一元二次方程式 | From: [111.83.133.17] | 發表日期 : 2021-08-20 13:51

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

}
}
}
 
#26684: Re:80%成功 只差顯示不出來 正確答案為: No real root


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.241.38.232]
最後登入時間 :
2024-10-01 22:15:14
a006. 一元二次方程式 | From: [123.110.34.107] | 發表日期 : 2021-08-20 14:51

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 的值上(常量)

 
#26691: Re:80%成功 只差顯示不出來 正確答案為: No real root


jackson199988@gmail.com (jackson)

學校 : 不指定學校
編號 : 160565
來源 : [223.138.166.159]
最後登入時間 :
2021-08-11 02:31:51
a006. 一元二次方程式 | From: [111.82.2.226] | 發表日期 : 2021-08-20 18:17

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()來判斷的話該怎麼做呢? 剛剛試了完全不行 

 
#26694: Re:80%成功 只差顯示不出來 正確答案為: No real root


jam930725@gmail.com (浮沉沉沉沉沉沉沉沉)

學校 : 國立臺中科技大學
編號 : 124762
來源 : [123.241.38.232]
最後登入時間 :
2024-10-01 22:15:14
a006. 一元二次方程式 | From: [123.110.34.107] | 發表日期 : 2021-08-20 18:50

這是拿你程式碼改的

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)的存在,抱歉...)

 
#26757: Re:80%成功 只差顯示不出來 正確答案為: No real root


jackson199988@gmail.com (jackson)

學校 : 不指定學校
編號 : 160565
來源 : [223.138.166.159]
最後登入時間 :
2021-08-11 02:31:51
a006. 一元二次方程式 | From: [111.253.13.15] | 發表日期 : 2021-08-23 13:48

這是拿你程式碼改的

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)的存在,抱歉...)

謝謝你!

 
ZeroJudge Forum