找到大的斐波纳契数的第n项

时间:2014-01-30 08:05:35

标签: c++ recursion fibonacci

我必须编写一个程序,我将获得第n个术语的最后三位数字。例如,第20个术语是6765,后三个数字是'765'。现在我需要找到Fibonacci序列的第一个数字,其最后三位数为“321”。

我在网上查了一下,发现第n个术语是479,而我写的程序甚至不能那么高。我找不到任何程序高于第100学期的人。

截至目前,他们无法找到高于100的字词? 除了递归之外你还有其他任何想法,找到以'321'结尾的数字的第一个数字?

我的递归代码非常基本:

long long fibNum(long long nth)
{
    if (nth == 1)
        return 1;
    else if (nth == 2)
        return 1;
    else
        return fibNum(nth - 1) + fibNum(nth - 2);
}

当我到第43个学期时,它开始减速。

1 个答案:

答案 0 :(得分:6)

第479号是     5696323922575865414847061494575945648081290145228607189038829076215134884313127297923138542545712321

即使在很长的长变量中也不适合。我建议你只考虑数字的最低部分来实现它。您不需要存储完整的数字只是为了计算最后3位数,然后估计整数。

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define PHI 1.61803399

int main(int argc, char *argv[]){
    int pos;
    int x = 0, y = 1, tmp = 0;
    long double num=0;

    int searched = atoi(argv[1]);

    printf("Looking for a fibonacci number ending with: %03d\n", searched);

    for(pos = 2; y != searched; pos++){
        tmp = x+y;
        x = y;
        y = tmp%1000;
    }

    pos--;
    printf("Found at position: %d\n", pos);

    num = (powl(PHI, pos) - powl(1-PHI, pos))/sqrt(5);
    printf("Approximated number %Le\n", num);

    while(num >= 10) num /= 10;

    printf("First digit: %d\n", (int)num);

    return 0;
}

输出:

> ./finbonacci 321
Looking for a fibonacci number ending with: 321
Found at position: 479
Approximated number 5.696326e+99
First digit: 5

此代码首先计算我们在序列中寻找的数字的位置,而不是使用可以接近斐波纳契数列的第n个数的Binet's formula。由于我们只需要第一个数字,我们可以容忍近似误差。