• 算法题---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;
    }
    View Code

    题目:

    用循环队列编写求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) 
     
  • 相关阅读:
    Spring学习记录-源码构建
    Spring学习记录
    java相关技术提纲
    Seata 分布式事务框架
    SourceTree学习记录
    其他源码管理工具
    分布式事务
    Score (模拟题)
    大整数排序
    字符串的查找删除 时间限制:1 Seconds 内存限制:32 Mbyte
  • 原文地址:https://www.cnblogs.com/luckyraye/p/6715362.html
Copyright © 2020-2023  润新知