【题目】

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. JS实现Ajax---例:获取服务器时间

    Ajax在本质上是一个浏览器端的技术 XMLHttpRequest XMLHttpRequest对象 XMLHttpRequest对象在IE浏览器和非IE浏览器中创建的方法不同. 简而言之:它可以异步 ...

  2. maven初学(三) SNAPSHOT

    使用场景: 通常一个大型软件是由多个模块组成的,不同的组使用相同应用的不同版本. 在开发阶段,可能经常需要修复bug和优化. 这种情况下就会导致其他组频繁更新代码和pom文件 SANPSHOT SNA ...

  3. java.lang.NoClassDefFoundError: org/jaxen/JaxenException

    今天想要解析 xml 文件,查了下,解析xml 的可以用:jdom 或者 dom4j 使用dom4j 来选用某一个指定元素的时候,如 List<Element> childElements ...

  4. BZOJ-3229 石子合并 GarsiaWachs算法

    经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...

  5. 【poj1009】 Edge Detection

    http://poj.org/problem?id=1009 (题目链接) 不得不说,poj上的水题还是质量非常高的= =,竟然让本大爷写了一下午. 转自:http://blog.sina.com.c ...

  6. java操作MySQL数据事务的简单学习

    在执行数据更改操作前使用数据库连接对象调用setAutoCommit方法(conn.setAutoCommit(false)),其参数true或false区别: true:sql命令的提交(commi ...

  7. hdu 1241 Oil Deposits(水一发,自我的DFS)

    解题思路: 1. 遍历扫描二维数组,遇到‘@’,结果ans++; 2. 将当前 i,j 位置置为‘*’,将当前‘@’的 i,j 传人到DFS函数中,开始遍历八个方向的字符 如果碰到 '@' 则先将当前 ...

  8. QueryHelp

    //辅助查询 Author:高兵兵 public class QueryHelp { #region IList<T> ToList<T>(string cmdText,str ...

  9. 新浪微博客户端(9)-实现版本新特性的ViewPager

    "DJNewFeatureViewController.m" #import "DJNewFeatureViewController.h" #define NE ...

  10. ubuntu系统自带的火狐(firefox)如何安装Adobe Flash

    当你刚装完系统,发现打开某些网站时,提示你“需要安装flash”,然后你点击确定,过了一会,提示你安装失败. 我也是遇到这种情况.我第一个反应是,我先不用firefox,我安装chrome. 可是当你 ...