问题
4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4,
利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 >200。
算法
对于一个队列,总有四个值在其内,用队列内的四个值计算出下一个值并将算出来的该值直接放入队尾,不考虑队满,因为要直接覆盖前面的第五个值,然后再计算,直至有一值大于200。
可以推广至k。
/*Lab2_2_19281158
*/
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<mm_malloc.h>
using namespace std;
#define MAXQSIZE 5 //由于检测队满算法牺牲一个数据空间
#define ElemType int
typedef struct
{
ElemType queue[MAXQSIZE];
int front, rear;
}sequeuetp;
void InitQueue(sequeuetp &Q); //初始化队列
void Enqueue(sequeuetp &Q, ElemType x); //入队
void Delcycque(sequeuetp &Q, ElemType &e); //出队
int f[1000] = {0};
int main()
{
sequeuetp Q;
int n;
//初始化
InitQueue(Q);
//入队
for(int i = 0;i < 3;i++)
{
f[i] = 0;
Enqueue(Q, f[i]);
}
f[3] = 1;
n = 4;
Enqueue(Q, f[3]);
while(Q.queue[Q.rear] <= 200)
{
f[n] = 0;
for(int i = 0;i < 4;i++)
{
f[n] += Q.queue[i];
}
Q.rear = (Q.rear + 1) % 4;
//Enqueue(Q, f[n]);
Q.queue[Q.rear] = f[n]; //直接覆盖
n++;
}
for(int i = 0;i < n - 1;i++)
{
cout<<f[i]<<" ";
}
return 0;
}
void InitQueue(sequeuetp &Q)
{
Q.front = 0;
Q.rear = 0;
}
void Enqueue(sequeuetp &Q, ElemType x)
{
//牺牲一个存储空间表示队列满
if( (Q.rear + 1) % MAXQSIZE == Q.front )
{
exit(0); //队满
}
else
{
Q.queue[Q.rear] = x;
Q.rear = (Q.rear + 1) % MAXQSIZE;
}
}
void Delcycque(sequeuetp &Q, ElemType &e)
{
//已经与队空区分
if(Q.front == Q.rear)
{
exit(0); //队空
}
else
{
e = Q.queue[Q.front];
Q.front = (Q.front + 1) % MAXQSIZE;
}
}