前往
大廳
主題

ZeroJudge - f971: WandaVision轉圈圈 解題心得

Not In My Back Yard | 2021-07-20 00:00:05 | 巴幣 100 | 人氣 199

題目連結:


題目大意:
輸入有多列(不多於 1000 列),每列給定一正整數 n(1 ≦ n ≦ 1000),請找出 x ^ n = 1 的所有複數解。假設有一解形為 a + bi,則需要輸出數字 a 、一個空白字元以及數字 b。請將這些根按照 a 的值由小排到大輸出,如果 a 一樣則按照 b 由小排到大。並且將所有根四捨五入至小數點後第三位。



範例輸入:
1
2
3
4


範例輸出:
1.000 0.000
-1.000 0.000
1.000 0.000
-0.500 -0.866
-0.500 0.866
1.000 0.000
-1.000 0.000
0.000 -1.000
0.000 1.000
1.000 0.000


解題思維:
相當經典的代數問題。

根據代數基本定理(Fundamental Theorem of Algebra):一個 n 次方的一元複數係數多項式方程式必定有 n 個複數根。

而 x ^ n = 1 的解之形式又是較奇特的(參見單位根)。假設 θ = 2π ÷ n(也就是將一整個圓的角度分 n 等分),則 x ^ n = 1 的解為以下:
cos(θ) + i × sin(θ)、
cos(2θ) + i × sin(2θ)、
cos(3θ) + i × sin(3θ)、
……
cos(nθ) + i × sin(nθ)(這等價於 cos(0) + i × sin(0))。
這個 n 個複數值。

將上述的值求出後按照題目要求排序並四捨五入後輸出即可(但是要注意浮點數誤差)。




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

創作回應

心彩
ERROR 值 如何決定要下多少?
2022-06-30 09:16:42
Not In My Back Yard
抱歉,我沒辦法給出答案。根據經驗,誤差通常設成要求值(像本題是小數點後「三」位)乘以 2 + 1 就可以了。
2022-06-30 19:03:06
Not In My Back Yard
但是本題測了一下,然後看了一下我的程式碼記錄,我當時應該是用試出來的。
2022-06-30 19:03:49

相關創作

更多創作