洛谷 P1755 斐波那契的拆分

题目背景

题目描述

已知任意一个正整数都可以拆分为若干个斐波纳契数,现在,让你求出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<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;
    }
}

 

posted @ 2017-11-23 20:59  一蓑烟雨任生平  阅读(314)  评论(0编辑  收藏  举报