a134: 00948 - Fibonaccimal Base

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

CPE 一顆星選集 49 道必考題

題目連結:https://zerojudge.tw/ShowProblem?problemid=a134

內容

給一組十進位數字,以費氏進位輸出(如下)。
17 = 1 0 0 1 0 1
13+3+1 = 13 8 5 3 2 1

輸入的第一行含有一個數字 N,代表以下有幾個數字 ( 1 ≤ N ≤ 500)。
接下來有 N 行,每行有一個小於 100 000 000 的正整數。數字不一定按順序出現。

範例輸入

10
1
2
3
4
5
6
7
8
9
10

範例輸出

1 = 1 (fib)
2 = 10 (fib)
3 = 100 (fib)
4 = 101 (fib)
5 = 1000 (fib)
6 = 1001 (fib)
7 = 1010 (fib)
8 = 10000 (fib)
9 = 10001 (fib)
10 = 10010 (fib)

想法

先建一個足夠大的陣列存費氏數列,將陣列由大跑到小,如果小於輸入值,則更新。

注意不可出現相鄰的1。

程式碼

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

int main(){
fastio;
int N, dp[41], num;
bool suc, beg;
cin >> N;
memset(dp, 0, sizeof(dp));
dp[0] = 1;
dp[1] = 2;
for(int i = 2; i < 41; ++i){
dp[i] = dp[i - 1] + dp[i - 2];
}
while(N--){
cin >> num;
suc = true;
beg = false;
cout << num << " = ";
for(int i = 40; i >= 0; --i){
if(dp[i] <= num){
beg = true;
if(suc){
num -= dp[i];
cout << 1;
suc = false;
}
else {
cout << 0;
suc = true;
}
}
else if(beg){
cout << 0;
suc = true;
}
}
cout << " (fib)\n";
}
}