您的位置:首页 > 理论基础 > 数据结构算法

严蔚敏数据结构习题3.32

2015-10-13 20:25 525 查看
试利用循环队列编写求k阶菲波那契序列中前n+1项的算法,要求满足:而,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为k,则在算法执行结束时,留在循环队列中的元素应是所求k阶菲波那契序列中的最后k项)

注意k阶菲波那契序列,一开始有k-1个0,第k个为1,然后第k+1个数为前k个数之和,如此类推~如:

2阶斐波那契数列:0,1,1,2,3,5,8……

3阶斐波那契数列:0,0,1,2,……

#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
typedef struct
{
int base[maxsize];
int head,rear;
}qunue;
/*初始化队列*/
init_qunue(qunue &q)
{
q.head=q.rear=0;
return 1;
}

int Fib(int k,int n)
{
int i,sum,j;
qunue q;
int m;
init_qunue(q);
for(i=0;i<k-1;i++)q.base[i]=0;
q.base[k-1]=1;
for(i=k;i<=n;i++)
{
m=i%k;/*只取前k个数,不懂就在纸上写几个循环就明白的了*/
sum=0;
for(j=0;j<k;j++)
sum+=q.base[(m+j)%k];/*将前k个数相加*/
q.base[m]=sum;/*赋值到第m个,成为下次循环的第k个数*/

}
return sum;
}
int main()
{
int x,k,n;
printf("输入max:");
scanf("%d",&x);
printf("输入费伯纳西数列阶数:");
scanf("%d",&k);
for(n=1;;n++)
{
if(Fib(k,n)<=x&&Fib(k,n+1)>x)break;
}
printf("n值为:%d\n",n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构