问题描述:
试利用循环队列编写k阶斐波那契序列中前n+1项的算法,要求满足:f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为K,则在算法执行结束时,留在循环队列中的元素应是所求K阶斐波那契序列中的最后k项)。
问题分析:
这道题可以这样想,循环队列满时,可继续将元素入队列,覆盖以前的值即可。
代码:
View Code总结:
还好,自己最后发现问题所在解决了。
更正:
#include<stdio.h>
#include<stdlib.h>
#define k 8
typedef struct{
int *base;
int front;
int rear;
}queue;
void InitQueue(queue &q){
q.base=(int *)malloc(k*sizeof(int));
if(!q.base)
printf("存储分配失败");//存储分配失败
q.front=q.rear=0;
}
void EnQueue(queue &q,int i)
{
q.base[q.rear]=i;
q.rear=(q.rear+1)%k;
}
void DeQueue(queue &q,int &i)
{
i=q.base[q.front];
q.front=(q.front+1)%k;
}
int QueueLength(queue &q)
{
return (q.rear-q.front+k)%k;
}
int fun(int m)
{
if(m==0)
return 0;
if(m==1)
return 1;
else
return fun(m-1)+fun(m-2);
}
int main()
{
queue q;
int e;
InitQueue(q);
int s,j=0,count=0,max;
printf("请输入约定的最大数:");
scanf("%d",&max);
for(int i=0;;i++)
{
s=fun(i);
if(s<=max)
{
if(i>=k)
DeQueue(q,e);
EnQueue(q,s);
j=i;
++j;
s=fun(j);
}
if(s>max)
break;
}
int len=k;
if(i<k-1)
len=QueueLength(q);
while(count<len)
{
DeQueue(q,e);
printf("%d
",e);
count++;
}
return 0;
}
