斐波那契序列码

时间:2015-05-14 06:42:53

标签: c math

Fibonacci数字在数学和计算机科学中有一系列有趣的用途。例如,假设有人在一天吃早餐时,单个霉菌孢子落在一条休息区。还假设在孢子形成48小时后,它能够克隆自身,并在此后每24小时创建一个新鲜的孢子。最后还假设在创建48小时后,每个新孢子也开始每天克隆新孢子。

通常F(n)= F(n-1)+ F(n-2)。

编写一个程序,打印出每天结束时出现的孢子数量。当孢子数量超过一千万时停止。需要多少天?

int days, next, first=0, second=1;

printf("Enter the day you want to know how many spores exists on\n");
scanf("%d", &days);

while(next < 10000000) {

    if(days == 1) {
        next = 1;
    }
    else {
        next = first + second;
        first = second;
        second = next;
    }
}
printf("The day %d has %d spores\n", days, next);

到目前为止,我只能做到这一点。但它没有把我带到哪里。其他人只能使用while,if和scanf函数吗?

3 个答案:

答案 0 :(得分:3)

Fibonacci序列的操作如下:

1 1 2 3 5 8 13 21 34等......

因此,归结为F(n)= F(n-2)+ F(n-1)的公式。您缺少增加天数的代码。

试试这个:

days = 1;
next = 0;
first = 0;
second = 1;

while(next < 10000000) {
    next = first + second;
    first = second;
    second = next;
    printf("The day %d has %d spores\n", days, next);
    days++;
}

那应该生成一个合适的斐波纳契数列。如果没有,我会纠正它。

编辑:我也注意到你的printf语句不在while循环中。此外,请注意我在进入循环之前如何设置变量,以便在循环内不需要if语句。这更像是一个性能问题,因为循环内部要做的事情越少,执行的速度就越快。

答案 1 :(得分:1)

问题在于,在计算孢子数时,不计算输入的天数。这是一个简单的工作代码。

#include <stdio.h>
#include <stdlib.h>
#define LIMIT 10000000
int main()
{
    int days, next, first=0, second=1, i = 0, current_day = 1;

    printf("Enter the day you want to know how many spores exists on\n");
    scanf("%d", &days);

    while(i < days) {

        if(days == 1) {
            next = 1;
        }
        if(next < LIMIT){
            next = first + second;
            first = second;
            second = next;
            printf("Spores at day %d : %d\n", current_day, next);
            current_day++;
        }
        if(next>= LIMIT)
        {
            printf("You reached the limit of 10.000.000 spores in %d days.\n", current_day);
            break;
        }
        i++;
    }

    return 0;
}

答案 2 :(得分:1)

对于快速算法,你可以使用它来绕过(并且可能会让那些给你这个问题的人感到惊讶)一劳永逸的递归公式。

F(n) = (pow((1 + sqrt(5))/2, n) - pow((1 - sqrt(5)) / 2, n)) / sqrt(5)

有关证明,请参阅 http://www.artofproblemsolving.com/wiki/index.php/Binet%27s_Formula

基本上给出F(n)的限制,只需重新排列公式即可找到n。或者只是尝试一些值,因为这个公式提供了更快的答案。