這題有兩種解法,一是將兩字串轉成數字,兩數字加總後再轉回 01 字串
二是運用有特殊規則的二進位來直接處理字串
若使用第一種解法,首先要求出 { 1 , 2 , 3 , 5 , 8 , ...... } 一共 100 個費式數字,很顯然這樣做必須用大數處理
然後讀字串,有 1 就取該數字並加總,最後再轉回字串,這樣太辛苦了
所以這裡我以第二種方式解,如下 :
1. 先讀字串並倒轉儲存,因為可能要進位,用陣列必須倒著存
2. 將字串每個字元變成數字,並且每一位相加後存在另一個陣列
3. 接著就是進位,因為 1 表示有這項數字,0 表示沒有,且規則說不能有相鄰的費式數字,故特殊的進位規則如下 :
a. 若第 i 位大於等於 1 且第 i + 1 位也大於等於 1,由於費式數列的本質,將會進位到第 i + 2 位
例 : 10011 兩個 1 相鄰會進位變成 10100
b. 若第 i 位大於 1,有以下情形
(1) 第 1 位相加,001 + 001 = 002 -> 010,第一位代表 1 第二位代表 2,所以跟一般二進位相同
(2) 第 2 位相加,010 + 010 = 020 -> 101,因 2 + 2 = 3 + 1,所以第一、三項要進位
(3) 第 i 位相加,i 大於 2, 1000 + 1000 = 2000 -> 1110 -> 10010
因 2 * F ( N ) = F ( N ) + F ( N - 1 ) + F ( N - 2 ) = F ( N + 1 ) + F ( N - 2 )
所以先進位第 i - 2 位,然後進位第 i + 1 位
因為上述進位規則,可能會動到低位數字,因此每次進位後都要檢查。可以用迴圈檢查,直到字串是合法的才跳開
最後依格式輸出即可