<谭> 6.7 求Fibonacci数列的前40个数。该数列有如下特点: 第1, 2两个数为1,1。从第3个数开始,每个数等于前2个数之和。
生成方法为:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)
#include <stdio.h>
int main()
{
long int f1, f2; /* 作为循环体的"前两项",会超过32767,所以用long */
int i; /* 计数 */
f1 = 1; f2 = 1;
for (i = 1; i <= 20; i++) /* 循环一次输出2个,共进行20次 */
{
printf("%12ld %12ld", f1, f2); /* 第22个数之后值超过32767,必须用ld,而非d */
if ( i % 2 == 0) /* 每次输出两个, 两次输出4个, 便换行 */
printf("\n"); /* 控制换行 */
f1 = f1 + f2; /* 计算下两个数 */
f2 = f1 + f2;
}
return 0;
}
运行结果:
========================================================
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 5702887 9227465 14930352
24157817 39088169 63245986 102334155
========================================================
★ 小知识(摘录):
斐波那契是意大利的数学家。他是一个商人的儿子。儿童时代跟随父亲到了阿尔及利亚,在那里学到了许多阿拉伯的算术和代数知识,从而对数学产生了浓厚的兴趣。
长大以后,因为商业贸易关系,他走遍了许多国家,到过埃及、叙利亚、希腊、西西里和法兰西。每到一处他都留心搜集数学知识。回国后,他把搜集到的算术和代数材料,进行研究、整理,编写成一本书,取名为《算盘之书》,于1202年正式出版。
这本书是欧洲人从亚洲学来的算术和代数知识的整理和总结,它推动了欧洲数学的发展。其中有一道“兔子数目”的问题是这样的:一个人到集市上买了一对小兔子,一个月后,这对小兔子长成一对大兔子。然后这对大兔子每过一个月就可以生一对小兔子,而每对小兔子也都是经过一个月可以长成大兔子,长成大兔后也是每经过一个月就可以生一对小兔子。那么,从此人在市场上买回那对小兔子算起,每个月后,他拥有多少对小兔子和多少对大兔子?
这是一个有趣的问题。当你将小兔子和大兔子的对数算出以后,你将发现这是一个很有规律的数列,而且这个数列与一些自然现象有关。人们为了纪念这位兔子问题的创始人,就把这个数列称为“斐波那契数列”。
又找到了这么一段话:
规律表:
月数 小兔 中兔 老兔 总数
1 1 0 0 1
2 0 1 0 1
3 1 0 1 2
4 1 1 1 3
5 2 1 2 5
6 3 2 3 8
7 5 3 5 13
在计算每一行时,大兔数为上月的大兔数加上月的中兔数,中兔数为上月的小兔数,小兔数为本月的大兔数,算总数为本月的小兔数加本月的中兔数加本月的大兔数。在观察总数的过程中找出了规律:总数的第一、二月都是1,以后的每一月是前两月的和。数列为1,1,2,3,5,8,13,21,34,55,……
当n=50时,后项与前项的比是1.61803398874989,而前项与后项的比是0.61803398874989,即b/a的值与a/b的值相差1,假设后项与前项的比是φ,则有(φ-1)/φ=1,解这个方程得:φ= (√5+1) /2,这就是黄金分割。
当n充分大时,斐波纳契数列后前项的比值,与前后项的比值,相差1,它们的比值是黄金分割!黄金分割是一个十分有用的无理数。据此,把黄金分割可用一个有理数近似表示,如斐波纳契数列的第七项与斐波纳契数列的第六项的比13/8,斐波纳契数列的第九项与斐波纳契数列的第八项的比34/21等都可以近似地表示为黄金分割,当然项数越后越精确。
验证一下:
#include <stdio.h>
int main()
{
long double f1, f2;
int i;
f1 = 1; f2 = 1;
for (i = 1; i <= 25; i++)
{
f1 = f1 + f2;
f2 = f1 + f2;
}
printf("%lf\n", (long double)f2/f1);
return 0;
}
运行结果:
==============
1.618034
==============
★ 经验证, 如果使用该程序,若循环7次,即: i<=7,则结果为1.618033,循环8次以上(有效范围内),均为1.618034, 由于"对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位", 也不知如何才能显示更多的小数位,用"老刑"的话说就是"这个事我很费解啊". 先搁这儿吧,有空再研究……
######################################数组########################################
今天看到数组这章了,有个例子就是用数组实现斐波那契数列的,补上……
#include <stdio.h>
int main()
{
int i;
int f[20] = {1,1};
for (i = 2; i < 20; i++)
f[i] = f[i-2] + f[i-1];
for (i = 1; i <= 20; i++)
{
printf("%8d", f[i-1]);
if (i % 5 == 0)
printf("\n");
}
return 0;
}
评论