目錄
1 問題描述
問題描述
利用標准庫中的cos(x)和fabs(x)函數實現arccos(x)函數,x取值范圍是[-1, 1],返回值為[0, PI]。要求結果准確到小數點后5位。(PI = 3.1415926)
提示:要達到這種程度的精度需要使用double類型。
提示:要達到這種程度的精度需要使用double類型。
樣例輸入
0.5
樣例輸出

數據規模和約定
-1 <= x <= 1, 0 <= arccos(x) <= PI。
2 解決方案
本題借用反三角函數,考查我們對於二分法思想的運用。
易知cos(a) = b,那么arccos(b) = a。那么現在求取arccos(x),設其結果為result。那么當cos(result)無窮趨近x值時,則說明,result則為我們需要求取的值,下面請看一張示意圖:
這題提交了好幾次,因為覺得自己思路是沒有問題,但是,提交后的評分結果一直為33分,后來用Java給定的Math.acos()函數,對比后,發現是自己設定的取值范圍不夠精確,導致計算結果偏大。
即:Math.abs(judge) > 0.000000000000001。
第一次做的時候,是這樣:Math.abs(judge) > 0.000001。導致當x取1或者-1時誤差太大,后來自己仔細一想,這個不能決定最終結果保留五位小數的誤差。
給我的教訓:下次碰到計算精確值時,盡量做到計算能夠達到最精確為准,這樣也可以防止自己沒有考慮仔細,導致相關意外情況發生。
經過修改后的代碼,運行評分為100分。
具體代碼如下:
import java.util.Scanner; public class Main { public final static double PI = Math.PI; public void getArcCos(double x) { double i = 0, j = PI; double result = (i + j) / 2; double judge = Math.cos(result) - x; double temp; while(Math.abs(judge) > 0.000000000000001) { result = (i + j) / 2; temp = Math.cos(result); if(temp - x > 0) { i = result; } else { j = result; } judge = Math.cos(result) - x; } System.out.printf("%.5f", result); return; } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); double x = in.nextDouble(); if(x < -1 || x > 1) return; test.getArcCos(x); } }