NUC1016 斐波那契数列

斐波那契数列

时间限制: 1000ms 内存限制: 65536KB

问题描述

“斐波那契数列”的发明者,是意大利数学家列昂纳多?斐波那契(生于公元1170年,籍贯大概是比萨,卒于1240年后)。他还被人称作“比萨的列昂纳多”。1202年,他撰写了《珠算原理》一书。

斐波那契数列衍生于《珠算原理》中的一道题目:

某人把一对兔子放入一个四面被高墙围住的地方。假设每对兔子每月能生下一对小兔,而每对新生小兔从第二个月开始又具备生育能力,请问:一年后应有多少对兔子?

正如丹?布朗对我们所言,答案就是0,1,1,2,3,5,8,13,21,然后可按34,55……一直排列下去。(从第三位起)每位数都是前两位数之和,这是欧洲人所知的第一个此类数列。

斐波那契数数列可表示为0、1、1、2、3... ( N1=0,N2=1 Ni=Ni-1+Ni-2 )

给定i计算斐波那契数列第Ni项最后7位数字.

输入描述

第一行有一个正整数N表示下边有N个情况需要你去计算。

接下来的N行每行有一个正整数i,表示计算第Ni项的最后7位数字。

其中( 1 ≤ i ≤ 1000000 )

输出描述

输出N行计算结果

样例输入

4

5

6

7

10

样例输出

3

5

8

34


问题分析:

对于每次输入的i,若调用一次计算函数,那么重复计算就太多了。所以,打表是必须的。

每一项求的是最后7位数,就用模除,数值就不太大了。

程序说明:

函数setfib()的功能是计算斐波那契数列的各个项,计算结果放入表中。

需要注意元素的个数,定义数组fib[]时,那个“+1”是必要的。


参考链接:(略)


AC的C++程序如下:

#include <iostream>

using namespace std;

const int MOD = 10000000;
const int N = 1000000;
int fib[N+1];

void setfib(int n)
{
   fib[1] = 0;
   fib[2] = 1;

   for(int i=3; i<=n; i++)
       fib[i] = (fib[i - 2] + fib[i - 1]) % MOD;
}

int main()
{
    int n, i;

    setfib(N);

    cin >> n;
    while(n--) {
        cin >> i;

        cout << fib[i] << endl;
    }

    return 0;
}





原文地址:https://www.cnblogs.com/tigerisland/p/7563883.html