描述
已知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)。
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项的值,占一行;
输出一个回车符。
以及第n项的值,占一行;
输出一个回车符。
输入样例
4 10000
输出样例
17
5536
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-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;
}