斐波那契数列及其性质

来源:互联网 发布:黑钢和知世 编辑:程序博客网 时间:2024/05/29 10:58


【斐波那契数列的由来】

一个人到集市上买了一对小兔子。一个月后这对小兔子长成一对大兔子。然后这对大兔子每过一个月就可以生一对小兔子,而每对小兔子也都是经过一个月可以长成大兔子,长成大兔后也是每经过一个月就可以生一对小兔子。那么从此人在市场上买回那对小兔子算起,每个月后他拥有多少对小兔子和多少对大兔子?这是一个有趣的问题。当你将小兔子和大兔子的对数算出以后你将发现这是一个很有规律的数列,而且这个数列与一些自然现象有关。人们为了纪念这位兔子问题的创始人,就把这个数列称为斐波那契数列。

 

【性质1】斐波那契与黄金分割

    有趣的是,这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当n趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近0.618

1÷1=11÷2=0.52÷3=0.666...3÷5=0.65÷8=0.625…………,55÷89=0.617977……………144÷233=0.61802546368÷75025=0.6180339886...

越到后面,这些比值越接近黄金比,即FN/FN+1≈0.618

 

【性质2 gcd(F[n+1],F[n])=1;
证明:根据辗转相减法则
gcd(F[n+1],F[n])
=gcd(F[n+1]-F[n],F[n])
=gcd(F[n],F[n-1])
=gcd(F[2],F[1])
=1

【性质3 gcd(F[n+m],F[n])=gcd(F[n],F[m])
证明:
 gcd(F[n+m],F[n])
=gcd(F[n+1]F[m]+F[n]F[m-1],F[n]);
=gcd(F[n+1]F[m],F[n]);
=gcd(F[n+1],F[n])*Gcd(F[m],F[n])
=gcd(F[m],F[n]);
于是:gcd(F[n],F[m])=F[gcd(n,m)];

 

【性质4 F[m+n]=F[m-1]F[n]+F[m]F[n+1]


【性质5】 gcd(F[n],F[m])=F[gcd(n,m)]

【有关习题】

【原题链接】

洛谷1225 :数楼梯

楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。编一个程序,计算共有多少种不同的走法。

【解法分析】

   数据范围很大,但实质只是一个斐波那契数列。所以用高精度+递推处理,递归会超时。

【代码实现】

#include

#define MAXL 100000

using namespace std;

int n;

string s="2",ss="1",temp;//sss分别赋初值第一项、第二项

string add(string s1,string s2)//高精度加法

{

   if(s1.size()

   int a[MAXL];

   int l1=s1.size(),l2=s2.size();

   for(int i=1; i<=l2; ++i)a[i]=s1[l1-i]+s2[l2-i]-96;

   for(int i=l2+1; i<=l1; ++i)a[i]=s1[l1-i]-48;

   for(int i=1; i<=l1; ++i)

       if(a[i]>=10)

       {

           a[i+1]+=a[i]/10;

           a[i]%=10;

       }

   string s;

   if(a[l1+1])s+=a[l1+1]+48;

   for(int i=l1; i>=1; --i)

       s+=a[i]+48;

   return s;

}

int main()

{

   cin>>n;

   if(n==1) cout<<"1";

   else if(n==0) cout<<"0";//0项为0,特判,否则90

   else if(n==2) cout<<"2";

   else//n大于等于3

   {

       while(n-2>0)//向前递推

       {

           temp=s;

           s=add(s,ss);

           ss=temp;

           n--;

       }

       cout<<s<<endl;

   }

   return 0;

}

 

0 0
原创粉丝点击