严蔚敏数据结构习题3.32

试利用循环队列编写求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;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值