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

xiaoxiao2021-02-28  68

题意:

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

分析:

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

n最大为 109 10 9 ,简单打了一个表,发现斐波那契数列45项就超过 1010 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; }
转载请注明原文地址: https://www.6miu.com/read-2599096.html

最新回复(0)