• 斐波那数


    /*
     * =====================================================================================
     *
     *       Filename:  fibo.c
     *
     *    Description:  Fibbonacci Number
     *
     *        Version:  1.0
     *        Created:  2013年11月19日 17时27分25秒
     *       Revision:  none
     *       Compiler:  gcc
     *
     *         Author:  Wenxian Ni (Hello World~), niwenxianq@qq.com
     *   Organization:  AMS/ICT
     *
     * =====================================================================================
     */
    
    #include "iostream"
    #include "queue"
    #include "cmath"
    #include <stdio.h>
    using namespace std;
    int fib1(int index)     //递归实现
    {
     if(index<1)
     {
      return -1;
     }
     if(index==1 || index==2)
      return 1;
     return fib1(index-1)+fib1(index-2);
    }
    
    int fib2(int index)     //数组实现,
    {
     if(index<1)
     {
      return -1;
     }
     if(index<3)
     {
      return 1;
     }
     int *a=new int[index];
     a[0]=a[1]=1;
     for(int i=2;i<index;i++)
      a[i]=a[i-1]+a[i-2];
     int m=a[index-1];
     delete a;         //释放内存空间
     return m;
    }
    
    int fib3(int index)           //借用vector<int>实现
    {
     if(index<1)
     {
      return -1;
     }
     vector<int> a(2,1);      //创建一个含有2个元素都为1的向量
     a.reserve(3);
     for(int i=2;i<index;i++)
     {
      a.insert(a.begin(),a.at(0)+a.at(1));
      a.pop_back();
     }
     return a.at(0);
    } 
    
    int fib4(int index)       //队列实现
    {
     if(index<1)
     {
      return -1;
     }
     queue<int>q;
     q.push(1);
     q.push(1);
     for(int i=2;i<index;i++)
     {
      q.push(q.front()+q.back());
      q.pop();
     }
     return q.back();
    }
    
    int fib5(int n)          //迭代实现
    {
     int i,a=1,b=1,c=1;
     if(n<1)
     {
      return -1;
     }
     for(i=2;i<n;i++)
     {
      c=a+b;     //辗转相加法(类似于求最大公约数的辗转相除法)
      a=b;
      b=c;
     }
     return c;
    }
    
    double fib6(int n) // 
    {
     double gh5=sqrt((double)5);
     return (pow((1+gh5),n)-pow((1-gh5),n))/(pow((double)2,n)*gh5);
    } 
    
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            printf("%d %d %d %d %d %.0f
    ",fib1(n),fib2(n),fib3(n),fib4(n),fib5(n),fib6(n));
        }
        return 0;
    }



    说明:

    1. 听说还有个数组法,不会

    2. 第6种公式法要四舍五入

    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    nodejs 文件拷贝
    MySQL linux二进制安装
    【Android工具类】验证码倒计时帮助类CountDownButtonHelper的实现
    JAVA一些基础概念
    程序猿生存定律-公司选择上的方法论
    Leetcode 第 2 题(Add Two Numbers)
    SpringMVC学习记录(五)--表单标签
    算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
    CentOS 7 virt-manager 无法连接本地的hypervisor
    Android自己定义View画图实现拖影动画
  • 原文地址:https://www.cnblogs.com/vintion/p/4117014.html
Copyright © 2020-2023  润新知