切換
舊版
前往
大廳
主題

ZeroJudge - d315: sigma sinkx 解題心得

Not In My Back Yard | 2020-06-16 01:17:03 | 巴幣 2 | 人氣 256

題目連結:


題目大意:
輸入有多列,每列給定兩正整數 n 、 x (1 ≦ n ≦ 10 ^ 31 - 1 、 1 ≦ x ≦ 2 ^ 31 - 11),其中 x 的單位為角度。

求 sin x + sin 2x + …… + sin nx 之值,四捨五入至小數點第四位後輸出。



範例輸入:
1 60
3 60
2147483647 30
0 0


範例輸出:
0.8660
1.7321
3.2321


解題思維:
我們需要推出公式,以免累加的時候誤差也跟著累積,推導過程如下:
所以公式即為 (cos(x ÷ 2) - cos((n + 0.5)x)) ÷ (2sin(x ÷ 2))

當三角函數輸入的單位是角度時,可以看到每 360° 就會循環。所以我們的 n 值跟 x 值都可以先取除以 360 的餘數(尤其 n 可以很大,數字變小比較不會有誤差)。

接著,因為一般程式的三角函數只吃弧度(radian,或稱弳度)作為輸入。因此,我們需要轉換 n 跟 x 。而因為 360° (角度) 對應到 2π (弧度) ,所以角度每度轉換成弧度為 π ÷ 180 。所以將 n 、 x 乘以 π ÷ 180 即可轉成弧度。

但是要注意的是如果輸入角度 x 為 0 ,轉成弧度也為 0 。而此時我們的公式中的分母之 2sin(x ÷ 2) 會產出 0 的輸出。而除以 0 是不合法的。但是我們知道這時的結果為
sin 0 + sin 2 × 0 + …… + sin n × 0 = 0
所以直接輸出 0 就好。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作