k阶斐波那契数列

来源:互联网 发布:windows字体文件在哪里 编辑:程序博客网 时间:2024/05/17 06:01
描述
已知K阶斐波那契数列定义为:
f0 = 0,  f1 = 0, … , fk-2 = 0, fk-1 = 1;
fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, …
利用循环队列编写求k阶斐波那契数列中前n+1项(f0, f1, f2,…, fn)的算法,要求满足:fn<=max,并且fn+1>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在算法执行结束时,留在队列中的元素应是所求k阶斐波那契序列中的最后k项fn-k-1 , fn-k, …, fn)。
 
输入
输入表示阶数的k(2<=  k  <= 100)以及表示某个常数的max(0 <= max <= 100000)。
 
输出
输出满足条件的项n(n从0开始计数),占一行; 
以及第n项的值,占一行;
输出一个回车符。
 
输入样例
4 10000
 
输出样例
17
5536

化简一下,得到迭代公式:
①:f(m)=f(m-1)+f(m-2)+…+f(m-k) 
②:f(m-1)=f(m-2)+f(m-3)+…+f(m-k-1)              
①-②: f(m)-f(m-1)=f(m-1)-f(m-k-1)                  
f(m)=2f(m-1)-f(m-k-1) 

#include <iostream>#include <cstdio>#include <stdlib.h>#include <algorithm>#include <queue>using namespace std;int main(){int a[120];int k, m;cin >> k >> m;int i ;for(i = 0; i < k-1; i++)a[i] = 0;a[k-1] = 1;a[k] = 1;int n = k+1;if(m == 0){cout << k-2 << endl;cout << 1 << endl;return 0;}if(m == 1){cout << k << endl;cout << 1 << endl;return 0;}while(a[n-1] <= m){a[n] = 2*a[n-1]-a[n-k-1];n++;}cout << n-2 << endl;cout << a[n-2] << endl;//system("pause");return 0;}


0 0
原创粉丝点击