#16642: 特殊二進位


freedom501999@gmail.com (帥氣魔方生)

學校 : 不指定學校
編號 : 88611
來源 : [39.8.203.54]
最後登入時間 :
2019-05-30 22:56:25
d666. 00763 - Fibonacci numbers -- UVa763 | From: [39.12.107.19] | 發表日期 : 2019-01-24 20:03

這題有兩種解法,一是將兩字串轉成數字,兩數字加總後再轉回 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 位

    因為上述進位規則,可能會動到低位數字,因此每次進位後都要檢查。可以用迴圈檢查,直到字串是合法的才跳開

最後依格式輸出即可

 
ZeroJudge Forum