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函数吗?
答案 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。或者只是尝试一些值,因为这个公式提供了更快的答案。