【题目】

log(n)时间Fib(n),本质log(n)求a^n。

【代码】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
 
#include "stdafx.h"
#include <iostream>
using namespace std;

/*
f(0) = 0.
f(1) = 1.
f(N) = f(N-1) + f(N-2)_ (N>=2)

see http://blog.linjian.org/articles/fibonacci-essay/ for more detail
*/

// recursive
unsigned int rfib(unsigned int n)
{
    // o(2^n)
)
    {
        return n;
    }
    else
    {
        );
    }
}

// use table to reuse value : forward

};
unsigned int tfib_forward(unsigned int n)
{
    // o(n)
;
    f[;
    ; i <= n; ++i)
    {
        f[i] = f[i - ];
    }
    return f[n];
}

// use table to reuse value : backward
unsigned int tfib_backward(unsigned int n)
{
    )
    {
        f[n] = n;
        return f[n];
    }
    else
    {
        )
            f[n] = tfib_backward(n - );
        return f[n];
    }
}

// use temp value instead of table
unsigned int fib(unsigned int n)
{
    // o(n)
)
    {
        return n;
    }
    else
    {
        , c;
        ; i <= n; ++i)
        {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

// use template meta programming #1 struct-enum
// enum has value range
#define FIBE(N) FibE<N>::Val

template<int N>
struct FibE
{
    enum
    {
        Val = FibE < N -  >::Val
    };
};

template<>
>
{
    enum
    {
        Val = 
    };
};

template<>
>
{
    enum
    {
        Val = 
    };
};

// use template meta programming # class-static const
#define FIBC(N) FibC<N>::val

template<int N>
class FibC
{
public:
     >::val;
};

template<>
>
{
public:
    ;
};

template<>
>
{
public:
    ;
};

// use calss-function
class Fib
{
public:
    Fib() : a()
    {
    }
    unsigned int operator()()
    {
        )
        {
            n++;
            ;
        }
        else
        {
            int c;
            c = a + b;
            a = b;
            b = c;
            return c;
        }
    }
private:
    int a, b, n;
};

// test
void test_tfib_forward()
{
    ; i < MAX; ++i)
    {
        cout << tfib_forward(i) << " ";
    }
}

void test_metaFibE()
{
    cout << FIBE() << endl;
}

void test_metaFibC()
{
    cout << FIBC() << endl;
}

void test_cfib()
{
    ;
    Fib fib;
    do
    {
        cout << fib() << endl;
    }
    while (i--);
}

int main()
{
    //test_tfib_forward();
    test_metaFibE();
    test_metaFibC();
    test_cfib();

system("pause");
    ;
}

【参考】

http://zhedahht.blog.163.com/blog/static/25411174200722991933440/

http://blog.csdn.net/foolishwolf_x/article/details/8774874

16.O(logn)求Fibonacci数列[Fibonacci]的更多相关文章

  1. 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]

    作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: /  0                      n=0 f(n)=      ...

  2. 《面试题精选》15.O(logn)求Fibonacci数列

    题目:定义Fibonacci数列例如以下: /    0                      n=0 f(n)=      1                      n=1          ...

  3. 【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。

    第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归 ...

  4. 用PL0语言求Fibonacci数列前m个中偶数位的数

    程序说明:求Fibonacci数列前m个中偶数位的数: 这是编译原理作业,本打算写 求Fibonacci数列前m个数:写了半天,不会写,就放弃了: 程序代码如下: var n1,n2,m,i; pro ...

  5. C++项目參考解答:求Fibonacci数列

    [项目:求Fibonacci数列] Fibonacci数列在计算科学.经济学等领域中广泛使用,其特点是:第一.二个数是1,从第3个数開始,每一个数是其前两个数之和.据此,这个数列为:1 1 2 3 5 ...

  6. [18/12/3]蓝桥杯 练习系统 入门级别 Fibonacci数列求模问题 题解思路

    前言略. 看到这个题目本来应该很高兴的,因为什么,因为太TM的基础了啊! 可是当你用常规方法尝试提交OJ时你会发现..hhh...运行超时..(开心地摇起了呆毛 //Fibonacci数列递归一般问题 ...

  7. 求Fibonacci数列通项公式

    0. Intro \[f_n=\begin{cases} 0 & (n=0) \\ 1 & (n=1) \\ f_{n-1}+f_{n-2} & (n>1) \end{c ...

  8. 用Python实现求Fibonacci数列的第n项

    1. 背景——Fabonacci数列的介绍(摘自百度百科): 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacc ...

  9. fibonacci 数列及其应用

    fibonacci 数列及其延展 fibonacci计算 fibonacci数列是指 0,1,1,2,3,5,8,13,21……这样自然数序列,即从第3项开始满足f(n)=f(n-1)+f(n-2): ...

随机推荐

  1. codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊

    一开始T了一组RE了一组,实在找不出错来,就把数组加了一个0竟然就多A了一组.很惊讶的又加了几个0最后竟然全A了!!! 懒得做了,改的是之前的那个蚯蚓的游戏问题.还是需要拆点,至于为什么不能重复走结点 ...

  2. hdu1255 矩阵的交 线段树+扫描线

    /* 不是叶子节点 ,且cnt=1.注意这里,cnt=1确切的意义是什么, 应该是,可以确定,这个区间被完全覆盖了1次, 而有没有被完全覆盖两次或以上则不知道无法确定,那么怎么怎么办了, 只要加上t[ ...

  3. codevs1746 贪吃的九头龙

    [问题描述]传说中的九头龙是一种特别贪吃的动物.虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落.有一 ...

  4. Chkrootkit Sourcecode Learning

    目录 . Chkrootkit Introduce . Source Code Frame . chklastlog.c . chkwtmp.c . ifpromisc.c . chkproc.c . ...

  5. OAuth2.0认证和授权原理

    什么是OAuth授权?   一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...

  6. Extjs Form用法详解(适用于Extjs5)

    Extjs Form是一个比较常用的控件,主要用来显示和编辑数据的,今天这篇文章将介绍Extjs Form控件的详细用法,包括创建Form.添加子项.加载和更新数据.验证等. 本文的示例代码适用于Ex ...

  7. Spring学习4-面向切面(AOP)之aspectj注解方式

    一.简介    1.AOP用在哪些方面:AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理.日志管理.权限控制,异常处理等,封装起来,便于减少系统的重复代码,降低模块间的耦合 ...

  8. jquery------.cycle的使用

    代码下载地址:http://malsup.github.io/jquery.cycle.all.js 把里面的代码复制到jquery.cycle.all.js里面 index.jsp <scri ...

  9. linux学习之用户管理

    用户管理是在root用户下进行相关操作的 1.配置文件路径:         保存用户信息的文件:/etc/passwd         保存密码的文件:/etc/shadow         保存用 ...

  10. hdu 1261 字串数

    解题思路:ACM紫书 第十章 P319 有重复元素的全排列 答案: 所有数的和的阶乘 除以 每个数阶乘的乘积 因为给定 (26*12)! 会爆掉(long long),这里用java 的BigInte ...