iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
自我挑戰組

cpe30天練習系列 第 12

cpe練習day12

  • 分享至 

  • xImage
  •  

今天是練習cpe的Fibonaccimal Base題目
##程式碼

#include <iostream>
using namespace std;

int main ()
{

	int N,n,x;
	int f[40]={0,1};
	for(int i=2 ;i<40 ;i++)
	{
		f[i]=f[i-1]+f[i-2];
	}
	cin >> n;
	while(n--) 
	{
		cin >> x;
		cout << x <<" = ";
		int c=0;
		int b[41]={};
		for(int j=39 ; j>=2 ; j--)
		{	
			if(x - f[j] >= 0)
			{
				c=1;
				if(b[j+1] != 1)
				{
					b[j] = 1;
					x = x - f[j];
				}
			}
			if(c==1)
			{
				cout << b[j];	
			}	
		}
		cout << "(fib)" << endl;
	}
	return 0;
}

##解題方向

  • 這段先建立前40個Fibonacci數字,存在陣列f[]裡。例如:f[2]=1,f[3]=2,f[4]=3,f[5]=5...這樣後面就可以用f[j]拿到第j個Fibonacci數字。
  • b[41]是一個用來記錄哪些Fibonacci數字有被選中的陣列(0 表示沒選,1表示有選)。
  • c 是一個「是否開始輸出的開關」,因為我們只想在找到第一個1後才開始輸出結果,避免印出多餘的0。
  • for (j=39; j>=2; j--)從大到小看f[j]能不能用來組成x。
  • if (x - f[j] >= 0)表示f[j]不超過剩下的x。
  • if (b[j+1] != 1) 這行確保我們不會連續選到兩個相鄰的Fibonacci數(這是Zeckendorf定理的要求)。
  • b[j] = 1 表示第j個Fibonacci被用到,然後x=x-f[j]扣掉它。
  • if (c==1)代表我們已經找到第一個能用的 Fibonacci,就開始輸出 b[j]。

上一篇
cpe練習day11
下一篇
cpe練習day13
系列文
cpe30天練習13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言