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<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;//初始化
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值