算法筆記_089:藍橋杯練習 7-2求arccos值(Java)


目錄

1 問題描述

2 解決方案

 


1 問題描述

問題描述
  利用標准庫中的cos(x)和fabs(x)函數實現arccos(x)函數,x取值范圍是[-1, 1],返回值為[0, PI]。要求結果准確到小數點后5位。(PI = 3.1415926)
  提示:要達到這種程度的精度需要使用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。導致當x1或者-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);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM