2010年10月25日 星期一

Fibonacci numbers

內容 : 正體->简体 
費氏數列的處理,一向都是相當地費事。當然今天也不例外。各 位應該有聽說過費式數列,或許沒有聽過以費式數列為基底的數字表示法吧!費氏數列基本上就是 (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

巧合的是,可以證明恰好只有一種這樣的表示方法。

我們可以用類似二進位數的方法來表達這樣的一個正整數在「費氏進位制」底下長的樣子。

不過,現在費事的地方來了,我們要怎麼樣對兩個「費氏進位」的數字作加法呢? 

這就是你的工作,給你兩個以費氏進位制 的數字,你必須把他們加起來,並且用費氏進位制表示出來。
輸入說明 :
每兩行為一組測資,每個長度不會超過100個,每組測資以空白隔開
輸出說明 :
請輸出結果,並每兩組之間空一行隔開
範例輸入 :
10010 
10000 
1000 
 
10000 
10000
範例輸出 :
10100 
100000 
100100

1 則留言:

  1. 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
    有稍微的問題..
    數字太大的話無法算,因為還沒寫大數減法。

    回覆刪除