斐波那契数列的四种实现

这学期我们终于开始学习算法设计。

第一次实验室实现斐波那契的四种算法,递归,非递归,公式法,矩阵相乘法。

当然,这些都是很基础的啦。

上机的时候,受到编译环境的问题(是不是高校都喜欢配置VC6.0?)让我很是郁闷,比如说long long无法用了,要用__int64,而__int64不支持cout操作。最后只能用scanf,printf等等保持统一风格

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
using namespace std;
#define N 2
/*
dicription:实现计算fibonacci的递归算法,线形for循环算法
注意在vc6.0下:
1.只能用__int64,不能使用long long
2.cout对__int64不起作用,只能用printf("%I64d",x);
3.为作方便,我直接将方法写成static,利用类名调用。
*/
 
//matrix
typedef struct            
{
    __int64 a[N][N];
}matrix;

matrix mult(matrix &A,matrix &B){
    int i,j,k;
    matrix c;
    for( i = 0; i < N ; i ++ )
        for( j = 0; j < N; j ++ )
        {
            c.a[i][j] = 0;
            for( k = 0 ; k < N ; k ++ )
                c.a[i][j] +=A.a[i][k] * B.a[k][j];
            
        }
        return c;        
        
}



class Fibonacci{

public:
    
    static __int64 fib_rec(int n){  //回归算法
        if(n==2||n==1 ) return 1;
        return fib_rec(n-1)+fib_rec(n-2);
    }
	static __int64 fib_line(int n){
	    __int64 f1=0,f2=1,tmp;
	
		while(n--){
		  tmp=f1;
		  f1=f1+f2;
		  f2=tmp;
		
		}
		return f1;
	
	}
    
    static __int64 * fib_line_save(int n){  //线性算法,并保存结果
        
        //从0开始算起
        __int64 * fib_v;int i;
        
        if(!( fib_v=(__int64 *)malloc( sizeof(__int64)*(n) ) ) ){
            
            cout<<"内存不足分配";
        };                      
        
        fib_v[0]=fib_v[1]=1;      //初始化
        
        for(i=2;i<n;i++){
            fib_v[i]=fib_v[i-1]+fib_v[i-2];
        }
       
        return fib_v;
        
    }
    static __int64 fib_matrix(int n){  //矩阵计算
        // Matrix(A)=  ┏ 1,1 ┓ ,pow(A,n) =┏ fib(n+1),fib(n)  ┓
        //             ┗ 1,0 ┛            ┗ fib(n)  ,fib(n-1)┛
        
        matrix fib_init,fib_res;
        
		fib_init.a[0][0]=1;fib_init.a[0][1]=1;
        fib_init.a[1][0]=1;fib_init.a[1][1]=0;
        fib_res.a[0][0]=1;fib_res.a[0][1]=0;
        fib_res.a[1][0]=0;fib_res.a[1][1]=1;
               
 
        while( n > 1 )
        {
             
            if( n % 2 == 1 )      //为奇数,不满足二分
            {
                n --;
                fib_res = mult(fib_init,fib_res); //乘于单位矩阵,奇数部分一直累乘到p中
            }
            else
            {
                n = n / 2;
                fib_init = mult(fib_init,fib_init);//两边累乘
            }
        }
        fib_res = mult(fib_init,fib_res);
       
    
        return fib_res.a[0][1];
    }
    
static __int64 fib_formula(int n){//公式法
        
	    double a=pow( (1+sqrt(5.0))/2.0 , n ) ;
        double b=pow( (1-sqrt(5.0))/2.0 , n ) ;
        double res=(a-b)/sqrt(5.0);
        return (__int64)res;      
    }
    
};
int main(){
    int i;
    __int64 *fib_p=Fibonacci::fib_line_save(11);

    for( i=1;i<=10;i++){
	    printf("fib_p      :\t%I64d\n", fib_p[i-1]);
        printf("fib_rec    :\t%I64d\n", Fibonacci::fib_rec(i) );   //test for rec
        printf("fib_matrix :\t%I64d\n", Fibonacci::fib_matrix(i)); //test for matrix
        printf("fib_line   :\t%I64d\n", Fibonacci::fib_line(i) );   //test for line
        printf("fib_formula:\t%I64d\n\n", Fibonacci::fib_formula(i));//test for formula
    }
	free(fib_p);                                       // free p
	cout<<"Enter a big number for  the test: ";
    scanf("%d",&i);
   
    //test for a big num;
 
	//printf("%I64d\n", Fibonacci::fib_rec(80) );  fail.
    printf("fib_matrix :\t%I64d\n",  Fibonacci::fib_matrix(i)); //test for matrix
    printf("fib_line   :\t%I64d\n",  Fibonacci::fib_line(i) );   //test for line
    printf("fib_formula:\t%I64d\n\n",Fibonacci::fib_formula(i));  //test for formula
    cout<<"Press any key to test  fib_matrix and fib_line";
    getch();
    
	for(i=40;i<=90;i++ ){
		
		printf("fib_matrix :\t%I64d\n",  Fibonacci::fib_matrix(i));  //test for matrix
        printf("fib_line   :\t%I64d\n",  Fibonacci::fib_line(i) );    //test for line
        printf("fib_formula:\t%I64d\n\n",Fibonacci::fib_formula(i));    //test for formula
    }
  
      return 0;
}

……


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值