K阶斐波那契数列(数据结构)

代码:

注意k阶斐波那契序列定义:第k和k+1项为1,前k - 1项为0,从k项之后每一项都是前k项的和

例如:k=2时,斐波那契序列为:0,1,1,2,3,5,8,13...

k=3时,斐波那契序列为:0,0,1,1,2,4,7,13,24...

#include <stdio.h>
#include <stdlib.h>

typedef struct  Queue
{
    int data[100];//数据
    int front;//头指示器
    int rear;//尾指示器
} SeqQueue;

void Initqueue(SeqQueue*Q);//初始化循环队列
void Compute(int max,int k,SeqQueue*Q);//计算斐波那契数列
void Printfqueue(SeqQueue*Q,int k);//输出最后k项

int main()
{
    SeqQueue queue;
    int Max,K;
    Initqueue(&queue);//初始化循环队列
    scanf("%d %d",&Max,&K);//输入约定的常数与阶数
    Compute(Max,K,&queue);//计算斐波那契数列
    Printfqueue(&queue,K);//输出最后k项
    return 0;
}

/*初始化循环队列
 *Q:被初始化的队
 */
void Initqueue(SeqQueue*Q)
{
    Q->front=Q->rear=0;
}

/*计算斐波那契数列  f(0)到f(n);
 *max: f(n)<=max,f(n+1)>max
 *k: 要求输出的最后 k 项
 *Q:目标循环队列
 */
void Compute(int max,int k,SeqQueue*Q)
{
    int sum1=0,sum2=1;//此时sum1是前k-1个数的和,sum2是前k个数和
    Q->rear=k-1;
    for(int i=0; i<k-1; i++)
    {
        Q->data[i]=0;//前k-1个数置为0
    }
    Q->data[k-1]=1;//第k个数为1
    while(!(sum2>max&&sum1<=max))//sum1是f(n),sum2是f(n+1)
    {
        int t=Q->data[Q->front],m,n;
        sum1=sum2;//下一个sum1等于sum2
        n=Q->rear=(Q->rear+1)%k;//形成只有k个数据的循环队列
        Q->data[Q->rear]=sum1;//入栈的是前k个数之和
        sum2=sum2-t+sum1;//下一个sum2 = 原来的sum2 - 队头:t + 新增的队尾:sum1
        m=Q->front=(Q->front+1)%k;//队头后移
    }
}

/*输出最后k项
 *Q:目标队列
 *k:要求的项数
 */
void Printfqueue(SeqQueue*Q,int k)
{

    for(int i=Q->front; i!=Q->rear; i++)
    {
        i=i%k;
        printf("%d ",Q->data[i]);
    }
    printf("%d",Q->data[Q->rear]);//特殊处理
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值