问题描述:用循环队列编写求k阶斐波那契序列中前n+1项(f1,f2,…,fn)的算法 ,要求满足fn<max,而fn+1>max, max为某个约定的常数,注意 :本题所用循环队列的容量为k,算法结束时,留在队列中的元 素为所求k阶斐波那契序列中的最后k项。
算法描述:
1、先将循环队列初始化,即从队首元素到队尾前一个元素共K-1项置0,队尾元素置1.
2、此时队列为满队状态,从队首开始累加至队尾,得到下一项的值。
3、队首出队,将第2步求得的值入队,同时改变队首队尾指针,队列依然处于满队状态。
4、循环第3步直到求得fn+1项大于等于max。
5、从队首开始依次输出队列内的元素。
代码如下:
#include<iostream>
#include<stdio.h>
#include<cstring>
#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