【数据结构--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;
}
### 西北工业大学 NOJ k 斐波那契数列实现方法 k 斐波那契数列是一种扩展形式的斐波那契数列,其定义为:对于给定的正整数 \( k \),序列中的每一项是从第 \( k+1 \) 项开始等于前面连续 \( k \) 项之和。特别地,前 \( k-1 \) 项均为零,而第 \( k \) 项为一[^3]。 以下是基于 Python 的一种实现方式: #### 方法描述 为了生成 k 斐波那契数列,可以按照以下逻辑编写代码: 1. 初始化一个长度为 \( n \) 的数组用于存储结果。 2. 设置前 \( k-1 \) 项为零,第 \( k \) 项为一。 3. 对于后续各项,通过累加前 \( k \) 项来计算当前值。 #### 实现代码 ```python def generate_k_fibonacci(n, k): if n <= 0: return [] result = [0] * max(k - 1, n) # 初始填充前 k-1 项为 0 if k >= 1 and len(result) >= k: result[k - 1] = 1 # 第 k 项设置为 1 for i in range(k, n): # 计算从第 k+1 项到第 n 项 start_index = i - k end_index = i current_value = sum(result[start_index:end_index]) result.append(current_value) return result[:n] # 测试函数 if __name__ == "__main__": n = 15 # 数列总长度 k = 4 # 定义数 fib_sequence = generate_k_fibonacci(n, k) print(f"k={k} 斐波那契数列 (共 {n} 项):", fib_sequence) ``` 上述代码实现了任意数 \( k \) 和指定长度 \( n \) 下的 k 斐波那契数列生成功能。其中 `generate_k_fibonacci` 函数接受两个参数:\( n \) 表示要生成的数列长度,\( k \) 是数。该算法的时间复杂度接近 \( O(n \cdot k) \)[^4]。 #### 输出示例 假设输入 \( n=15 \), \( k=4 \),则输出如下: ``` k=4 斐波那契数列 (共 15 项): [0, 0, 0, 1, 1, 2, 4, 8, 15, 29, 56, 108, 208, 401, 773] ``` 此结果与已知的标准 k 斐波那契数列一致。 --- ### 注意事项 当处理较大的 \( n \) 或较高的数 \( k \) 时,需注意内存消耗以及可能发生的溢出问题。可以通过优化求和部分减少不必要的重复运算提升效率。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

codeqb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值