山东省第七届ACM大学生程序设计竞赛 B题 Fibonacci

题意:

斐波那契数列,给你一个数n,问你是否可以由斐波那契数相加得到,可以的话输出相加的表达式,不可以的话输出-1

分析:

Input
4
5
6
7
100
Output  
5=5
6=1+5
7=2+5
100=3+8+89

n最大为 10 9 ,简单打了一个表,发现斐波那契数列45项就超过 10 10 ,大水题。
打表,从第一个大于n的项开始,往前加,加和大于n就不标记,小于n就标记为可用,直到加和等于n,然后正序查找标记数组,输出即可。。另外设置一个标记,如果直到最后都没有等于n,就修改标记,输出-1;

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <algorithm>
#include <queue>
#include <map>
#define ll long long;
using namespace std;
const int maxn = 40+5;
const int mod = 1e9;
int num[maxn];
bool flag[maxn];
int cnt = 0;
void init(){
    num[1] = 1;
    num[2] = 2;
    for(int i = 3; i < 45;i++){
        num[i] = num[i-1]+num[i-2];
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    init();
    int T;cin>>T;
    while(T--){
        memset(flag,false,sizeof(flag));
        int n; cin>>n;
        cout<<n<<"=";
        int k = 0;
        for(int i = 1; i < 45;i++){
            if(n < num[i]){
                k = i - 1;
                break;
            }
        }
        int sum = num[k];
        //cout<<num[k]<<" "<<k<<endl;
        flag[k] = true;
        if(sum == n){
            cout<<n<<endl;
            continue;
        }
        bool ff = false;
        for(int i = k - 1;i > 0;i--){
            if(sum + num[i] > n){
                continue;
            }
            else if(sum + num[i] < n){
                flag[i] = true;
                sum += num[i];
            }
            else{
                flag[i] = true;
                ff = true;
                break;
            }
        }
        if(!ff){
            cout<<-1<<endl;
        }
        else{
            bool li = true;
            for(int i = 0; i < maxn;i++){
                if(flag[i] && li){
                    cout<<num[i];
                    li = false;
                    continue;
                }
                if(flag[i] && !li){
                    cout<<"+"<<num[i];
                }
            }
        }
        cout<<endl;

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shensiback/article/details/80166762