# Greedy# Number Theory# Base Conversion

a134 - 00948 - Fibonaccimal Base

🔗 前往 ZeroJudge 原題

題目描述

題目要求將給定的十進位數字轉換為費氏進位表示法。費氏進位是一種特殊的進位制,其位數由費氏數列決定。轉換的限制條件是不允許出現相鄰的 1。

解題思路

程式碼的核心思想是貪心演算法。從最大的費氏數開始,嘗試從輸入數字中減去它,如果可以減去,則在結果中添加一個 '1',否則添加一個 '0'。這個過程重複進行,直到輸入數字變為 0。由於費氏數列的特性,這種貪心策略可以保證得到唯一的費氏進位表示法。程式首先預先計算出前 40 個費氏數,然後對每個輸入數字進行轉換。

複雜度分析

  • 時間複雜度: O(N * log(M)),其中 N 是輸入數字的個數,M 是輸入數字的最大值。log(M) 代表計算費氏數列的數量級,以及貪心演算法的迭代次數。
  • 空間複雜度: O(1),程式只使用了固定大小的陣列來儲存費氏數列,因此空間複雜度是常數級別。

程式碼

#include <iostream>
#include <string>
using namespace std;
int a[40]={0};
int main(){
	a[0]=1;
	a[1]=2;
	for(int i=0;i<39;i++){
		if(i!=0)
		a[i+1]=a[i]+a[i-1];
	}
	int c;
	cin >> c;
	while(cin >> c){
		bool f=0,d=0;
		cout << c << " = ";
		while(c>0){
			for(int i=39;i>=0;i--){
				if(c>=a[i]){
					c-=a[i];
					cout << "1";
					if(c==0){
						while(i--){
							cout << "0";
						}
					}
					f=1;d=1;
					i--;
				}
				else if(c<a[i]&&f!=0)
					cout << "0";
				if(f!=0&&d==1&&i>=0){
					cout << "0";
					d=0;
				}
			}
		}
		cout << " (fib)\n";
	}
}

Discussion