【题目】

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. 基本的mediaQuery写法,不复习又忘记了

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. zoj3882 博弈

    我理解错题目意思,稀里糊涂A了.其实就是先手必胜. #include<stdio.h> int main() { int n; while(scanf("%d",&am ...

  3. Erlang第三课 ---- 创建和使用module

    ----------------小技巧----------------------------- 因为这一课开始,我们要使用Erlang文件操作,所以,我们期待启动shell的时候,当前目录最好是是我 ...

  4. py替换掉换行符

    for line in file.readlines(): line=line.strip('\n')

  5. 初学Struts2-自定义拦截器及其配置

    自定义拦截器,首先新建一个继承自AbstractInterceptor类的类,然后重写intercept方法,代码如下 public class HelloInterceptor extends Ab ...

  6. hdu 1257 最少拦截系统(贪心)

    解题思路:[要充分理解题意,不可断章取义] 贪心:每个防御系统要发挥其最大性能, 举例: Input : 9 389 207 155 300 299 170 155 158 65 Output: 2 ...

  7. KxMenu下拉菜单

    + (void)createMenu:(id)sender target:(UIViewController *)t { NSArray *menuItems = @[ [KxMenuItem men ...

  8. IOS学习笔记—苹果推送机制APNs

    转自:唐韧_Ryan http://blog.csdn.net/ryantang03/article/details/8482259 推送是解决轮询所造成的流量消耗和 电量消耗的一个比较好的解决方案, ...

  9. nginx 启动/停止/重启 BAT

    cls @ECHO OFF SET NGINX_PATH=D: SET NGINX_DIR=D:\Hack\nginx\color 0a TITLE Nginx 管理程序 Power By AntsG ...

  10. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇(转)

    ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇   阅读目录 ASP.NET Identity 前世今生 建立 ASP.NET Identity 使用ASP.NET ...