使用循环队列求K阶斐波拉契数列 (Sum K order Fibonacci Numbers base on round-robin queue)

问题描述:用循环队列编写求k阶斐波那契序列中前n+1项(f1,f2,…,fn)的算法 ,要求满足fnmax, max为某个约定的常数,注意 :本题所用循环队列的容量为k,算法结束时,留在队列中的元 素为所求k阶斐波那契序列中的最后k项。


K阶斐波拉契数列定义:前K-1项为0,第K项为1,从第K+1项起该项为前K项的和。


算法描述:
1、先将循环队列初始化,即从队首元素到队尾前一个元素共K-1项置0,队尾元素置1.
2、此时队列为满队状态,从队首开始累加至队尾,得到下一项的值。
3、队首出队,将第2步求得的值入队,同时改变队首队尾指针,队列依然处于满队状态。
4、循环第3步直到求得fn+1项大于等于max。
5、从队首开始依次输出队列内的元素。
代码如下:
#include
#include
#include
#define K 5							 //K阶斐波拉契数列
using namespace std;

typedef struct
{
	int data[K];
	int f, r;
}SeQueue;

int main()
{
	SeQueue q;
	int max, i, sum = 0, temp, count = 0;
	printf("当前程序功能为求%d阶斐波拉契数列的最后%d项\n", K, K);
	printf("请输入max的值:");
	scanf_s("%d", &max);
	
	
	for (q.f = 0, q.r = 0; q.r < K - 1; q.r++,count++)				//队列初始化
		q.data[q.r] = 0;
	q.data[q.r] = 1;
	count++;

	while (max >= sum)								//开始循环
	{
		temp = q.f;
		sum = 0;
		while (temp != q.r)
		{
			sum += q.data[q.f];
			temp++;
			temp = temp%K;
		}
		sum += q.data[q.r];
		q.f++;
		q.f = q.f%K;
		q.r++;
		q.r = q.r%K;
		q.data[q.r] = sum;
	}
	printf("最后%d项为:\n", K);
	for (i = q.f; i != q.r; i=(i+1)%K)
		printf("%d ", q.data[i]);
	printf("%d\n", q.data[q.r]);
	system("pause");
}
编译环境:Visual Studio

你可能感兴趣的:(Data,Strutures,and,Algorithm)