Back
Featured image of post UVa10221-Satellites 解題 (C++)

UVa10221-Satellites 解題 (C++)

地球的半徑為 6440 公里,給予軌道上兩衛星與地球表面的距離及與圓心形成的角度,求兩衛星之間的弧長及弦距。

輸入

一行一筆資料,資料以空格分隔,分別為衛星離地球表面的距離、角度、及單位 (deg 角度 及 min 弧分)。

Ex:

500 30 deg
465 1800 min
900 175 deg
...
...

輸出

輸出計算出來的弧長及弦距,以空格分隔,需到小數點後六位。

解題

1000 205 deg 此資料作為範例,先將半徑加回去,$1000+6440=7440$,接著由於角度大於 180,所以用 360 減去角度才是最小夾角,也就是 $360-205=155$。為了等一下方便計算,可以先把角度轉換成徑度。 \[ deg \times \pi \div 180 = rad \newline 155 \times \pi \div 180 = 2.7052603405… \]

半徑及角度都處理完後就可以開始計算了。

弧長公式為 $r \theta$,$2.7052603405… \times 7440=20127.1369339986…$,取到小數點後六位即為$20127.136934$。

計算弦長則需使用餘弦定理$\sqrt{b^2+c^2-2bc\cos A}$。$\sqrt{7440^2+7440^2-2\cdot 7440\cdot 7440\cos \left(2.70526\dots \right)} = 14527.2845859446…$,取到小數點後六位即為$14527.284586$。

若單位為弧分,如 200 2700 min,則需先將弧分轉成角度 ($min \div 60 = deg$),再進行上述運算。

程式碼

將上述過程轉為程式。

#include <cmath>   // cos(), sqrt(), M_PI
#include <iomanip>  //setprecision()
#include <iostream>
#include <string>
using namespace std;
int main(){
    double s,a;
    string string;
    while(cin >> s >> a >> string){
        if(string[0] == 'm')
            a /= 60;
        s += 6440;
        if(a > 180)
            a = 360 - a;
        a = a * M_PI / 180;
        cout << fixed << setprecision(6) << s * a << " " << sqrt(s * s + s * s - 2 * s * s * cos(a)) << endl;
    }
}

簡報

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy