题意:
斐波那契数列,给你一个数n,问你是否可以由斐波那契数相加得到,可以的话输出相加的表达式,不可以的话输出-1
分析:
Input
4
5
6
7
100
Output
5=5
6=1+5
7=2+5
100=3+8+89
n最大为
109
10
9
,简单打了一个表,发现斐波那契数列45项就超过
1010
10
10
,大水题。 打表,从第一个大于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];
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;
}