题意:
斐波那契数列,给你一个数n,问你是否可以由斐波那契数相加得到,可以的话输出相加的表达式,不可以的话输出-1
分析:
Input
4
5
6
7
100
Output
5=5
6=1+5
7=2+5
100=3+8+89
n最大为
,简单打了一个表,发现斐波那契数列45项就超过
,大水题。
打表,从第一个大于n的项开始,往前加,加和大于n就不标记,小于n就标记为可用,直到加和等于n,然后正序查找标记数组,输出即可。。另外设置一个标记,如果直到最后都没有等于n,就修改标记,输出-1;
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <algorithm>
#include <queue>
#include <map>
#define ll long long;
using namespace std;
const int maxn = 40+5;
const int mod = 1e9;
int num[maxn];
bool flag[maxn];
int cnt = 0;
void init(){
num[1] = 1;
num[2] = 2;
for(int i = 3; i < 45;i++){
num[i] = num[i-1]+num[i-2];
}
}
int main(){
std::ios::sync_with_stdio(false);
init();
int T;cin>>T;
while(T--){
memset(flag,false,sizeof(flag));
int n; cin>>n;
cout<<n<<"=";
int k = 0;
for(int i = 1; i < 45;i++){
if(n < num[i]){
k = i - 1;
break;
}
}
int sum = num[k];
//cout<<num[k]<<" "<<k<<endl;
flag[k] = true;
if(sum == n){
cout<<n<<endl;
continue;
}
bool ff = false;
for(int i = k - 1;i > 0;i--){
if(sum + num[i] > n){
continue;
}
else if(sum + num[i] < n){
flag[i] = true;
sum += num[i];
}
else{
flag[i] = true;
ff = true;
break;
}
}
if(!ff){
cout<<-1<<endl;
}
else{
bool li = true;
for(int i = 0; i < maxn;i++){
if(flag[i] && li){
cout<<num[i];
li = false;
continue;
}
if(flag[i] && !li){
cout<<"+"<<num[i];
}
}
}
cout<<endl;
}
return 0;
}