【数据结构--noj】k阶斐波那契数列

题目
样例
这个题目有陷阱!!!
k阶并不是两个的和了,而是k个的和
这就是为什么wa了五次的原因qwq(我好笨)
在这里插入图片描述

for(i=0;i<length;i++){
            sum+=elem[(front-i+length)%length];

        }

除此之外没有什么问题了,移动front就行了

#include <iostream>
using namespace std;
//注意k一定要大于等于2
//初始化时,要把f(1)和f(2)入队
//front 指向下一个需要插入的位置
//只需要把front-1和front-2相加,然后再front++即可
//进行一次循环,即front重新回到0的位置
//终止条件为f(n)<max,max<f(n)+f(n-1)
template <class T>
class SQueue
{
public:
    T *elem;
    int front;
    int rear;
    int length;
    int MAXSIZE;
    SQueue(int n);
    void EnterQueue(const T &x);
    void DeleteQueue();
    bool IsEmpty();
    void PrintQueue();
    int Size();
    void Clear();
    void Fibonacci(int max, int k);
};

template <class T>
SQueue<T>::SQueue(int n) : length(0)
{
    front = rear = 0;
    MAXSIZE = n + 1;
    elem = new int[MAXSIZE];
}

template <class T>
void SQueue<T>::EnterQueue(const T &x)
{

    elem[rear] = x;
    rear = (rear + 1) % MAXSIZE;
    length++;
    if ((rear + 1) % MAXSIZE == front)
    {
        return;
    }
}
template <class T>
void SQueue<T>::DeleteQueue()
{
    if (rear == front)
    {
        return;
    }
    front = (front + 1) % MAXSIZE;
    length++;
}

template <class T>
bool SQueue<T>::IsEmpty()
{
    return rear == length;
}

template <class T>
int SQueue<T>::Size()
{
    return length;
}

template <class T>
void SQueue<T>::PrintQueue()
{
    int i = 0;
    for (i = 0; i < length; i++)
    {
        cout << elem[(front+i) % length] << " ";
    }
    cout << endl;
}

template <class T>
void SQueue<T>::Clear()
{
    while (length > 0)
    {
        DeleteQueue();
    }
}
template <class T>
void SQueue<T>::Fibonacci(int max, int k)
{
    EnterQueue(1);
    EnterQueue(1);

   
    // cout<<"length=  "<<length<<"  MAXSIZE="<<MAXSIZE<<endl;
    while (length + 1 < MAXSIZE)
    {
        EnterQueue(elem[length - 1] + elem[length - 2]);
    }
    // PrintQueue();
    // cout<<"front="<<front<<" rear="<<rear<<endl;
    while(1){
        int i=0;
        int sum=0;
        for(i=0;i<length;i++){
            sum+=elem[(front-i+length)%length];

        }
        int k=(front-1+length)%length;
        // int k_1=(front-2+length)%length;
        // cout<<"f(n)="<<elem[k]<<"  f(n+1)="<<elem[k]+elem[k_1]<<endl;
        if(elem[k]<=max&&sum>max)
        break;
        elem[front]=sum;
        front=(front+1)%length;
        // PrintQueue();
        
        
    }
    PrintQueue();
}
int main()
{
    int max,k;
    // freopen("in010.txt", "r", stdin);
    cin>>max>>k;
    SQueue<int> L(k);
    // cout<<"maxsize=="<<L.MAXSIZE<<endl;
    L.Fibonacci(max,k);

    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codeqb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值