k阶斐波那契数列

描述
已知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 
#include 
#include 
#include 
#include 
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;
}


你可能感兴趣的:(数据结构与算法)