日期:2025年12月21日
ZeroJudge 題目連結:a134. 00948 - Fibonaccimal Base
解題想法
由於題目限制要轉換的數字是小於 $100,000,000$ 的正整數,而費氏數列第 40 項就已經是 $102,334,155$,所以建表時只要建前 40 項就可以了。 我另外寫一個轉換數字基底用的函式,假設要轉換的數字是 num,先判斷特例,如果 num 等於 0 直接回傳字串 0,如果 num 等於 1 直接回傳字串 1。接下來用一個 for 迴圈,從表格 fib 後面往前找第一個小於等於 num 的值,以這一項作為起點 start。再用一個 for 迴圈,從 start 往回找到 fib[2] 為止,如果 num 大於等於 fib[j],要選用這一項,儲存轉換結果的字串 s 加上 1,再將 num 減去 fib[j];反之,字串 s 加上 0。
Python 程式碼
使用時間約為 19 ms,記憶體約為 2.9 MB,通過測試。
def convert(num):
if num == 0: return "0"
if num == 1: return "1"
start = -1
for j in range(40, 1, -1):
if fib[j] <= num:
start = j
break
if start == -1: return "-1"
s = ""
for j in range(start, 1, -1):
if num >= fib[j]:
s += "1"
num -= fib[j]
else:
s += "0"
return s
fib = [0]*41
fib[1] = 1
for i in range(2, 41):
fib[i] = fib[i-1] + fib[i-2]
n = int(input())
for _ in range(n):
m = int(input())
print(f"{m:d} = {convert(m)} (fib)")