算法题---k阶斐波那契数列

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>

using namespace std;

int main()
{
    int a[120];
    int k, m;
    while (1)
    {
        cout << "输入阶数k和约定的常数max。k和max用空格分开。" << endl;
        cin >> k >> m;
        int i;
        for (i = 0; i < k - 1; i++)
            a[i] = 0;
        a[k - 1] = 1;
        a[k] = 1;
        int n = k + 1;
        if (m == 0)
        {
            cout << k - 2 << endl;
            cout << 1 << endl;
            return 0;
        }
        if (m == 1)
        {
            cout << k << endl;
            cout << 1 << endl;
            return 0;
        }
        while (a[n - 1] <= m)
        {
            a[n] = 2 * a[n - 1] - a[n - k - 1];
            n++;
        }
        cout << n - 2 << endl;
        cout << a[n - 2] << endl;
    }

    return 0;
}

题目:

用循环队列编写求k阶斐波那契序列中前n+1项(f1,f2,…,fn)的算法,要求满足fn≤(小于等于)max,而fn +1>max

max为某个约定的常数。注意:本题所用循环队列的容量为k,算法结束时,留在队列中的元素为所求k阶斐波那契序列中的最后k项

输入

输入表示阶数的k(2<=  k  <= 100)以及表示某个常数的max(0 <= max <= 100000)。

输出

输出满足条件的项n(n从0开始计数),占一行;  以及第n项的值,占一行; 输出一个回车符。

输入样例

4 10000

输出样例

17 5536

思路:

已知K阶斐波那契数列定义为: f0 = 0,f1 = 0, … ,fk-2 = 0, fk-1 = 1;

并且fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, …

化简一下,得到迭代公式:

①:f(m)=f(m-1)+f(m-2)+…+f(m-k)  ②:f(m-1)=f(m-2)+f(m-3)+…+f(m-k-1)

①-②: f(m)-f(m-1)=f(m-1)-f(m-k-1)

f(m)=2f(m-1)-f(m-k-1) 

时间: 2024-10-10 20:49:19

算法题---k阶斐波那契数列的相关文章

C语言算法:完善当年自编的k阶斐波那契数列

以下为大二时候的日志回放:" 题目扩展到K阶, k阶斐波那契数列, 1阶(即k=1):1.1.1.1.1.1.1.-- a0=a[1-1]=1,a1=1,a2=1,a3=1,a4=1,a5=1,a6=1-- 3阶(k=3):0.0.1.1.2.4.7..... a0=0,a1=0,a2=a[3-1]=1,a3=0+0+1=1,a4=0+1+1=2,a5=1+2+4=7 4阶:0.0.0.1.1.2.4.8.15.27-- a0=0,a1=0,a2=0,a3=a[4-1]=1,a4=1,a5=2,

算法导论-求(Fibonacci)斐波那契数列算法对比

目录 1.斐波那契数列(Fibonacci)介绍 2.朴素递归算法(Naive recursive algorithm) 3.朴素递归平方算法(Naive recursive squaring) 4 .自底向上算法(Bottom-up) 5. 递归平方算法(Recursive squaring) 6.完整代码(c++) 7.参考资料 内容 1.斐波那契数列(Fibonacci)介绍 Fibonacci数列应该也算是耳熟能详,它的递归定义如上图所示. 下面2-6分别说明求取Fibonacci数列的

循环队列,4阶斐波那契数列

4阶斐波那契序列如下:f0=f1=f2=0, f3=1,…,fi=fi-1+fi-2+fi-3+fi-4, 利用容量为k=4的循环队列,构造序列的前n+1项(f0, f1 , f2 ,… fn ),要求满足fn ≤200而fn+1 >200. #include <stdio.h>#include <stdlib.h> #define MAXSIZE 4 typedef struct {    int *base;    int front;    int rear;    i

《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨.他被人称作“比萨的列昂纳多”.1202年,他撰写了<算盘全书>(Liber Abacci)一书.他是第一个研究了

水题(water) 【斐波那契数列】

题意: 其中,\(f(1)=1,f(2)=1\). 传送门 分析: 首先先看斐波那契数列的几何意义: 图中各数字为正方形的边长. 可以发现其面积关系刚好满足题目中的等式: \[\sum_{i=1}^{n}{f(i)}=f(n)\times f(n+1) \] 因此 \(f(n)\) 实际上就是斐波那契数列,所以当 \(x\) 是斐波那契数时,求 \(m\) 进制下末尾 \(0\) 的个数.否则,求 \(z\) 皇后数(可以预处理出). 代码: #include <bits/stdc++.h>

-----------------------算法学习篇:斐波拉契数列------------------------

------------------------------书瓖果---------------------------------- 1.性能较差的递归解决算法 int fib(int n) { if(n <= 1) { return n; } else { return fib(n-1) + fib(n-2); } } 2.性能较好的动态规划算法:计算出一个值后将其保存在一个数组中,后面再用时,就不用重新计算 int fib2(int n) { int i; int array[n]; ar

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

51Nod——T 1242 斐波那契数列的第N项

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n)

51nod 1242 斐波那契数列的第N项(矩阵快速幂)

1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) = F(n - 1) + F(n - 2) (n >= 2) (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...) 给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可. Input 输入1个数n(1 <=