內容 : 正體->简体
費氏數列的處理,一向都是相當地費事。當然今天也不例外。各 位應該有聽說過費式數列,或許沒有聽過以費式數列為基底的數字表示法吧!費氏數列基本上就是 (1,1,2,3,5,8,...),定義第零項、第一項都是1,自第二項起,每一項的數值皆等於前兩項的和。接下來我們來考慮費氏進位制:
說得單純一些,就是我們考慮將一個正整數 X 表示成費氏數列當中某些不重複項的和。例如
35 = 1 + 34 = 1 + 13 + 21 = 1 + 5 + 8 + 21 = 1 + 2 + 3 + 8 + 21
看起來有很多種表示法對吧?但若我們規定「選出來的數字不能有相鄰的項」,那麼一切就會變得簡單些了,例如:
35 = 1 + 34
30 = 1 + 8 + 21
28 = 2 + 5 + 21
12 = 1 + 3 + 8
7 = 2 + 5
巧合的是,可以證明恰好只有一種這樣的表示方法。
我們可以用類似二進位數的方法來表達這樣的一個正整數在「費氏進位制」底下長的樣子。
不過,現在費事的地方來了,我們要怎麼樣對兩個「費氏進位」的數字作加法呢?
這就是你的工作,給你兩個以費氏進位制 的數字,你必須把他們加起來,並且用費氏進位制表示出來。
說得單純一些,就是我們考慮將一個正整數 X 表示成費氏數列當中某些不重複項的和。例如
35 = 1 + 34 = 1 + 13 + 21 = 1 + 5 + 8 + 21 = 1 + 2 + 3 + 8 + 21
看起來有很多種表示法對吧?但若我們規定「選出來的數字不能有相鄰的項」,那麼一切就會變得簡單些了,例如:
35 = 1 + 34
30 = 1 + 8 + 21
28 = 2 + 5 + 21
12 = 1 + 3 + 8
7 = 2 + 5
巧合的是,可以證明恰好只有一種這樣的表示方法。
我們可以用類似二進位數的方法來表達這樣的一個正整數在「費氏進位制」底下長的樣子。
不過,現在費事的地方來了,我們要怎麼樣對兩個「費氏進位」的數字作加法呢?
這就是你的工作,給你兩個以費氏進位制 的數字,你必須把他們加起來,並且用費氏進位制表示出來。
輸入說明 :
每兩行為一組測資,每個長度不會超過100個,每組測資以空白隔開
輸出說明 :
請輸出結果,並每兩組之間空一行隔開
範例輸入 :
10010
1
10000
1000
10000
10000
範例輸出 :
10100
100000
100100
Dim num(100) As String
回覆刪除Dim q As String
Public Sub Form_Load()
Open App.Path & "/in.txt" For Input As #1
Open App.Path & "/out.txt" For Output As #2
num(1) = "1": num(2) = "1"
For i = 3 To 100
num(i) = myadd(num(i - 1), num(i - 2))
Next i
Do Until EOF(1)
Input #1, x
Input #1, y
x = StrReverse(x)
y = StrReverse(y)
q = ""
Print StrReverse(Fibo(x, y, ""))
Loop
Close #2
Close #1
End Sub
Public Function Fibo(x, y, q) As Long
Do Until InStr(x, 1) = 0
k = InStr(x, "1")
x = Left(x, k - 1) & "0" & Right(x, Len(x) - k)
q = myadd(q, num(k))
Loop
Do Until InStr(y, 1) = 0
k = InStr(y, "1")
y = Left(y, k - 1) & "0" & Right(y, Len(y) - k)
qq = myadd(qq, num(k))
Loop
ans = myadd(q, qq)
For j = check(ans) To 1 Step -1
If ans - num(j) >= 0 Then
Fibo = "1" & Fibo
ans = ans - num(j)
Else
Fibo = "0" & Fibo
End If
Next j
End Function
Public Function check(k) As Integer
For j = 100 To 1 Step -1
If Val(k) >= Val(num(j)) Then
check = j: Exit Function
End If
Next j
End Function
Public Function myadd(a, b) As String
Dim c As String, q1 As Integer, q2 As Integer, nt As Integer
nt = 0: c = ""
If Len(a) < Len(b) Then
Min = Len(a): Max = Len(b): k = b
Else
Min = Len(b): Max = Len(a): k = a
End If
For i = 1 To Min
q1 = Mid(a, Len(a) - i + 1, 1)
q2 = Mid(b, Len(b) - i + 1, 1)
c = ((q1 + q2 + nt) Mod 10) & c
nt = (q1 + q2 + nt) \ 10
Next i
If nt > 0 Then
If Max = Min Then
myadd = nt & c
Else
myadd = myadd(Left(k, Max - Min), nt) & c
End If
Else
If Max = Min Then
myadd = c
Else
myadd = Left(k, Max - Min) & c
End If
End If
End Function
by Yung
有稍微的問題..
數字太大的話無法算,因為還沒寫大數減法。