v4t3561(拆斐波那契数)
Fibonacci
Description
Fibonacci numbers are well-known as follow:
Now given an integer N, please find out whether N can be represented as the sum of several Fibonacci numbers in such a way that the sum does not include any two consecutive Fibonacci numbers.
Input
Multiple test cases, the first line is an integer T (T<=10000), indicating the number of test cases.
Each test case is a line with an integer N (1<=N<=10^9).
Output
One line per case. If the answer don’t exist, output “-1” (without quotes). Otherwise, your answer should be formatted as “N=f1+f2+…+fn”. N indicates the given number and f1, f2, … , fn indicating the Fibonacci numbers in ascending order. If there are multiple ways, you can output any of them.
Sample
Input
Copy4
5
6
7
100
Output
Copy
5=5
6=1+5
7=2+5
100=3+8+89
不需要用long long,只存小于1e9的数,然后从大向小遍历。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int i,t,n,a[50],b[50];
a[1]=1;
a[2]=2;
for(i=3;i<=45;i++)
a[i]=a[i-1]+a[i-2];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int cnt=0,k=n;
for(i=45;i>0;i--)
{
if(a[i]<=n)
{
b[cnt++]=a[i];
n=n-a[i];
}
}
if(!n)
{
cout<<k<<"=";
for(i=cnt-1;i>=0;i--)
{
if(i<cnt-1)
cout<<"+";
cout<<b[i];
}
cout<<'\n';
}
else
cout<<"-1"<<'\n';
}
return 0;
}