有限小數的連分數表示法

發布時間: Dec. 20, 2023, 5:08 p.m.   最後更新時間: Dec. 20, 2023, 5:17 p.m.   時間限制: 1000ms   記憶體限制: 128M

這題是今年資訊學科能力競賽北二區複賽下午場的第四題,雖然說區賽下午場的題目大都比上午難,而且這題還是下午的最後一題,但Colin覺得這題(對於軟研社的各位來說一定)相當的水,所以就把它放上來了XD。

題目是這樣的:

已知可以證明「任何的有限小數都可以化為有限的連分數表示法」,

若$x$為一正有限小數,$x=a_0+\frac{1}{a_1+\frac{1}{a_2+\frac{1}{a_3}}}$,($a_0$為正整數或$0$,其餘各項皆為正整數)

則表示為:$[a_0;a_1,a_2,a_3]$,($a_0$與$a_1$間以分號隔開,其餘各項以逗號隔開,最後一項(此例中為$a_3$)不可為$1$)

例如:

$3.1416=3+\frac{1}{7+\frac{1}{16+\frac{1}{11}}}$

表示為:$[3;7,16,11]$

$1.414=1+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{2+\frac{1}{5+\frac{1}{3}}}}}}$

表示為:$[1;2,2,2,2,5,3]$

輸入一個正有限小數$x$,小數點後位數不超過15位,小數點前不會有多餘的$0$,小數點後可能會有多餘的$0$

依照題序格式輸出$x$的連分數表示法

複製範例
3.1416
[3;7,16,11]
複製範例
1.4140
[1;2,2,2,2,5,3]
複製範例
0.123456789123456
[0;8,9,1,152414,1,3,3,9,3,2,9,2,1,2,1,6]

可能會用到的C++內建函式:

#include <algorithm>

a,b數值交換: swap(a,b)

#include <cmath>

$a$的$n$次方: pow(a,n)

#include <string>

string轉int: stoi(某個字串)

string轉long long: stoll(某個字串)

各種型別轉string: to_string(某個型別的東西)

詳細用法請查詢C++ Reference

math string

竹中軟研39th第一次競賽(社內賽)