noj10k阶斐波那契数列

本文介绍了一种使用链式存储结构的循环队列来计算k阶斐波那契数列的方法。通过递归函数计算每个数列项,并结合链表数据结构实现入队、出队操作,确保队列在满时能更新数据。代码中包括初始化队列、入队、判满、出队等操作,并提供了完整的C语言实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题 noj10k阶斐波那契数列

题目
在这里插入图片描述
首先,我们需要明白k阶斐波那契数列的定义,它不是我们之前熟知的那种斐波那契数列,其定义如下:

K阶斐波那契数列的前K-1项均为0,第k项为1,以后的每一项都是前K项的和
比如二阶斐波那契数列:0、1、1、2、3、5、8、13、21、34、…
三阶则是:0、0、1、1、2、4、7…

笔者采用循环队列中的链式存储结构解答(网上也有诸多大佬的其他解法)
在这里插入图片描述
话不多说,上代码:

#include <stdio.h>
#include <stdlib.h>
//递归函数,计算k阶斐波那契数列
int fib(int n,int k)//n为项,k为阶数

{
    if(n<=k-1) return 0;//前k-项为0
    if(n==k) return 1;//第k项为1
    else
    {
        int num=0;
        for(int i=0;i<k;i++,n--)
        {
            int t=fib(n-1,k);
            num+=t;
        }
        return num;
    }
}
//结点
typedef struct Node
{
    int val;
    struct Node *next;
}Node,*ListNode;
//队列
typedef struct queue
{
    ListNode front;
    ListNode rear;
}LinkQueue;
//初始化队列
void InitQueue(LinkQueue *a)
{
    if(!a) return;
    a->front=a->rear=(ListNode)malloc(sizeof(Node));
    a->front->next=NULL;
}
//入队
void AddNode(LinkQueue *a,int n)
{
    if(!a) return;
    ListNode p=(ListNode)malloc(sizeof(Node));
    p->val=n;
    p->next=a->front;
    a->rear->next=p;
    a->rear=p;
}
//判满 1为满
int JudgeFull(LinkQueue *s,int n)
{
    int i=0;
    ListNode p=s->front->next;
    while(p!=s->front)
    {
        i++;
        p=p->next;
    }
    if(i==n) return 1;
    else return 0;
}
//出队
int DeQueue(LinkQueue *s)
{
    ListNode p;
    int m;
    if(s->front==s->rear){printf("队列已空");}
    else
    {
        p=s->front->next->next;
        m=p->next->val;
        s->front->next=p;
    }
    return m;
}
//输出
void PrintQueue(LinkQueue *s)
{
    ListNode p=s->front->next;
    while(p!=s->front)
    {
        printf("%d ",p->val);
        p=p->next;
    }
}

int main()
{
    int max,k;
    scanf("%d%d",&max,&k);
    int i=1; //i记录斐波那契数列项数 起始为f(0),f(1)
    LinkQueue a;
    InitQueue(&a);
    //这里可能有一点问题,理解成把0项去掉
    AddNode(&a,1);
    AddNode(&a,1);
    int num=0;
    //由于之前WA多次,以为是特殊数据问题
    if(k==0)
    {
        return 0;
    }
    if(k==1)//直接算就行
    {
        int t=0;
        while(t<=max)
        {
            num=fib(i,k);
            t=fib(i+1,k);
            i++;

        }
        printf("%d",num);
        return 0;
    }
    while(1)
    {
        num=fib(i,k);
        if(num>max)//如果大于了,就输出
        {
            PrintQueue(&a);
            break;
        }
        else
        {
          int temp=JudgeFull(&a,k);
          if(temp==1)//队满,则更新数据
          {
              DeQueue(&a);
              AddNode(&a,num);
          }
          else//否则继续添加节点
          {
              AddNode(&a,num);
          }
        }
        i++;
    }
    return 0;
}

希望大家多多批评指正~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值