zoukankan      html  css  js  c++  java
  • C Fibonacci前n项和

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //Fibonacci非递归
    int fibonnaci1(int n);//求某一项的值
    int fibonnaci2(int n);//求某一项的值
    long sumFi(int n);//求前n项的和
    
    //递归法求前n项和 实际上是将结果都放在一个数组中  然后对该数组求和
    int arr[20]={0,0,0,0,0};
    long putToArrayFi2(int n);
    long sumFi2(int n);
    
    double fenmu[21];
    double fenzi[21];
    double sumME(int n);
    
    int main() {
        printf("%d\n", fibonnaci2(5));
        printf("%d\n", fibonnaci1(5));
        printf("%ld\n",sumFi(5));//长整型数据 ld  记住是拉登
        printf("%d\n",putToArrayFi2(5));
        printf("%ld\n",sumFi2(5));
    
        //接下来求一个特殊数列
        //  2/1 + 3/2 + 5/3 + 8/5 + 13/8 ...
        //仔细观察 发现分子分母都是Fibonacci数列  一个从2 3开始  另一个从 1 2 开始
        printf("%lf",sumME(20));
    
        return 1;
    }
    
    int fibonnaci2(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return fibonnaci2(n - 1) + fibonnaci2(n - 2);
        }
    }
    
    int fibonnaci1(int n){
        int t1=1;
        int t2=1;
        int t3=0;
        int i=3;
        for(i=3;i<=n;i++){
            t3=t1+t2;
            t1=t2;
            t2=t3;
        }
        return t3;
    }
    
    //求前n项和的时候用非递归比较方便
    long sumFi(int n){
        long sum=2;
        int t3=0;
        int t1=1;
        int t2=1;
        if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }
    
        int i=3;
        for(i=3;i<=n;i++){
            t3=t1+t2;//当前项是t3  他是前两项的和
            sum+=t3;
            t1=t2;//重新赋值前两项 为下一项求值做准备  //当然 我还可以把求出的每一项都放在数组中
            t2=t3;
        }
        return sum;
    }
    
    
    long putToArrayFi2(int n){
        if (n == 1 ) {
            arr[n]=1;
        } else if(n==2){
            arr[1]=1;
            arr[2]=1;
    
        }else {
            arr[n]=putToArrayFi2(n-1)+putToArrayFi2(n-2);
        }
        return arr[n];
    }
    
    long sumFi2(int n){
        long sum=0;
        int i=1;
        for(;i<=n;i++){
            sum=sum+arr[i];
        }
        return sum;
    }
    
    double sumME(int n){
        fenzi[1]=2;
        fenmu[1]=1;
        fenzi[2]=3;
        fenmu[2]=2;
        int i=3;
        for(;i<=n;i++){
            fenzi[i]=fenzi[i-1]+fenzi[i-2];
            fenmu[i]=fenmu[i-1]+fenmu[i-2];
        }
    
        double sum=0;
    
        for(i=1;i<=n;i++){
            //printf("--%lf--",fenzi[i]/fenmu[i]);
            sum+=fenzi[i]/fenmu[i];
        }
        return sum;
    
    }
  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/cart55free99/p/2973198.html
Copyright © 2011-2022 走看看