题目背景
无
题目描述
已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出n的拆分方法
输入输出格式
输入格式:
一个数t,表示有t组数据
接下来t行,每行一个数n(如题)
输出格式:
t行,每行一个字符串,表示拆分方法(格式:n=a1+a2+a3+..+an),要求从小到大输出
输入输出样例
说明
若有多组数据,以个数最小的为准,若仍有多组,输出右边尽量大的一组
对于100%的数据 t<=1000 1<=n<=10^9
思路:模拟,一个数只能使用一次。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int t,n,pos; int f[50],ans[50]; int main(){ scanf("%d",&t); f[0]=1;f[1]=1; for(int i=2;i;i++) if(f[i-1]+f[i-2]>1000000000) break; else f[i]=f[i-1]+f[i-2]; while(t--){ scanf("%d",&n); pos=0; printf("%d=",n); for(int i=43;i>=0;i--) if(f[i]<=n&&n>0){ n-=f[i]; ans[++pos]=f[i]; } printf("%d",ans[pos]); for(int i=pos-1;i>=1;i--) printf("+%d",ans[i]); cout<<endl; } }