zoukankan      html  css  js  c++  java
  • 斐波那契数列的n种食用方法

    大扎好,我系bb机,贪玩斐波那契,介四里没有挽过的船新版本,挤需体验三番钟,里造会干我一样,爱象节款数列。(

    菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
    给出一个正整数k,要求菲波那契数列中第k个数是多少。

    大概就是:

    1,1,2,3,5,8,13,21,34,55,……

    (等等我是不是算错了)

    (算了不管了)

    辣么这个题呢最简单的是用递推,代码如下:

     1 #include<cstdio>
     2 using namespace std;
     3 int fblq[100];
     4 int main()
     5 {
     6     fblq[1] = fblq[2] = 1;
     7     int n,i;
     8     scanf("%d",&n);
     9     for(i = 3;i <= n;i++){
    10         fblq[i] = fblq[i - 1] + fblq[i - 2];
    11     }
    12     printf("%d",fblq[n]);
    13     return 0;
    14  } 

    诶、多简单啊

    其实到此为止就可以了,但是秉着洛谷“A+B问题”题解的精神,我又到老师的ppt里挖出了这个:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 typedef long long ll;
     6 //中间运算可能会超过int范围,需要long long
     7 const int N=2;
     8 int n,p;
     9 ll m;
    10 struct node{
    11     //结构体存储矩阵
    12     ll g[N+2][N+2];
    13 }f,res;
    14 void matrixI(node &x){
    15     //构造单位矩阵
    16     for(int i=1; i<=N; i++){
    17         for(int j=1; j<=N; j++)
    18             if(i==j) x.g[i][j]=1LL;
    19             else x.g[i][j]=0LL;
    20     }
    21 }
    22 void matrixMultiple(node &x,node &y,node &z){
    23     //矩阵乘法
    24     memset(z.g,0,sizeof(z.g));
    25     for(int i=1; i<=N; i++){
    26         for(int j=1; j<=N; j++) if(x.g[i][j]){
    27             for(int k=1; k<=N; k++){
    28                 z.g[i][k]+=x.g[i][j]*y.g[j][k];
    29                 if(z.g[i][k]>=m) z.g[i][k]%=m;
    30             }
    31         }
    32     }
    33 }
    34 void matrixMuli(int k){
    35     //快速幂运算
    36     matrixI(res);
    37     node tmp=f, t;
    38     while(k){
    39         if(k&1){
    40             matrixMultiple(res,tmp,t); res=t;
    41         }
    42         matrixMultiple(tmp,tmp,t); tmp=t;
    43         k>>=1;
    44     }
    45 }
    46 ll solve(){
    47     if(n<=2) return 1LL;
    48     matrixMuli(n-2);
    49     ll ret=res.g[1][1]+res.g[2][1];
    50     if(ret>=m) ret-=m;
    51     return ret;
    52 }
    53 int main(){
    54     scanf("%d%d",&n,&p);
    55     m=p;
    56     f.g[1][1]=1;
    57     f.g[1][2]=1;
    58     f.g[2][1]=1;
    59     f.g[2][2]=0;
    60     int res=(int)solve();
    61     printf("%d
    ",res);
    62     return 0;
    63 }

    当然递推都可以变成递归(?)的,所以就有了这个:

     1 #include<cstdio>
     2 using namespace std;
     3 int fblq(int n)
     4 {
     5     if(n == 1)    return 1;
     6     if(n == 2)    return 1;
     7     return (fblq(n - 1) + fblq(n - 2));
     8 }
     9 int main()
    10 {
    11     int n,ans;
    12     scanf("%d",&n);
    13     ans = fblq(n);
    14     printf("%d",ans);
    15     return 0;
    16 }

    嗯,没了(暂时)

    又是一个正经的水笔呢(

  • 相关阅读:
    华硕ASUS A3V 拆解图 http://m.linktone.com/report/pdjj/14001781862.shtml
    华硕A3V 迅驰 配置详情
    Dvbbs 更换论坛置顶图片
    Flash 图片轮换效果
    动网官方最新dvbbs7.1sp1商业版下载,附存储过程解密代码!
    在VC中为应用程序添加图形超链接功能
    VC常见数据类型转换详解
    查询Access逻辑字段遇到的问题 武胜
    几个不错的开源的.net界面控件 转自http://zchuang2004.spaces.live.com/blog/cns!8C4AEEE059DED8B1!157.entry 武胜
    C#正则表达式整理备忘 转载(http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html) 武胜
  • 原文地址:https://www.cnblogs.com/aristocrat/p/8460182.html
Copyright © 2011-2022 走看看