题目背景
无
题目描述
已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法
输入输出格式
输入格式:
一个数t,表示有t组数据
接下来t行,每行一个数n(如题)
输出格式:
t行,每行一个字符串,表示拆分方法(格式:n=a1+a2+a3+..+an),要求从小到大输出
输入输出样例
输入样例#1: 复制
input1:1
1
input2:1
10
输出样例#1: 复制
output1:1=1;
output2:10=2+8;
说明
若有多组数据,以个数最小的为准,若仍有多组,输出右边尽量大的一组
对于100%的数据 t<=1000 1<=n<=10^9
从大到小
#include<iostream>
#include<cstdio>
using namespace std;
int a[60],i,j,x,t,tot,pd,b[60],all;//B数组用于记录
void work(int k)//暴搜
{
if(k==0)
{
pd=1;
return;
}
for(int i=all;i>=1;i--)
{
while(k-a[i]>=0)
{
k-=a[i];
b[++tot]=a[i];
work(k);
if(pd==1)
return;
tot--;
k+=a[i];
}
}
}
int main()
{
a[1]=1;a[2]=2;i=3;
while(a[i-1]<=1e9)//预处理兔子数列
{
a[i]=a[i-1]+a[i-2];
i++;
}all=i-1;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&x);
pd=0;
cout<<x<<"=";
work(x);
for(j=tot;j>=2;j--)
{
cout<<b[j]<<"+";
b[j]=0;
}
cout<<b[1]<<endl;
b[tot]=0;//初始化
tot=0;//初始化
}
}