主题:[讨论]菲波那契数列 pascal !
Cook1e
[专家分:0] 发布于 2009-11-01 16:05:00
题目描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 20)
输出
输出有n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数的大小
样例输入
4
5
2
19
1
样例输出
5
1
4181
1
回复列表 (共10个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2009-11-01 23:55:00
如果不使用计算公式,那么最笨的办法就是一个一个加。。。
板凳
小田甜 [专家分:3910] 发布于 2009-11-02 16:10:00
直接交表即可。
const
a:array[1..20]=(1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765);
n,i,m:integer;
begin
readln(n);
for i:=1 to n do begin readln(m); writeln(a[m]); end;
end.
至于到用公式计算的问题:给计算机计算不是这么容易的事情,所以还不如递推来得快。
当然,如果布置这项作业是在学习递归的时候布置的,你也可以尝试用递归来写。
3 楼
cgl_lgs [专家分:21040] 发布于 2009-11-02 23:59:00
呵呵,终于想起来这个数列与什么有关了~~~
与黄金分割有关,它的通项公式为:
sq5:=sqrt(5.0)
f(n):=((0.5+sq5/2.0)**n-(0.5-sq5/2.0)**n)/sq5
n从0开始:)
4 楼
abcwuhang [专家分:1840] 发布于 2009-11-06 17:59:00
咨询楼上:若n巨大,有没有二分的方法求??
5 楼
cgl_lgs [专家分:21040] 发布于 2009-11-09 00:16:00
如果巨大,则此法就不合适了,因为超出了浮点数所能表达的最多有效位数,则你就取不出实际的整数了。
6 楼
小田甜 [专家分:3910] 发布于 2009-11-09 18:00:00
这里是斐波那契额数列不是n次方,我认为不能二分。
如果n比较大那么高精度。
7 楼
cgl_lgs [专家分:21040] 发布于 2009-11-09 22:54:00
当使用双精度时:
n小于等于75时,结果的整数部分是精确的(2111485077978055);n为76时,结果的整数部分则开始会有误差了(3416454622906716:比实际结果大1)
:)
如果需要计算76及以上的结果时,可以以74与75的结果为基准进行计算:)
8 楼
小田甜 [专家分:3910] 发布于 2009-11-10 21:05:00
我不知道楼上是按照什么公式计算的,是不是上面那个带根号的式子。
但可以肯定地是,由于实型(包括real, double等)不可避免的会有误差,所以,大数字的计算还是必须使用高精度,否则必然会导致错误。
实型的存储使用的是底数*10^指数的形式保存的,由于计算机的离散性,实际上是在用每个区间上的中间值来近似代替这个区间上的所有数,所以出现误差也是不可避免的。
9 楼
cgl_lgs [专家分:21040] 发布于 2009-11-10 22:51:00
当然是用我回复的公式来计算的啦,在n为76以前,双精度还是够的。
菲波那契级数实际上跟黄金分割有关,在n为76以后再使用高精计算才是有必要的,否则只是白白浪费机时而已:)
10 楼
yanruixin [专家分:0] 发布于 2010-02-06 13:52:00
没那么麻烦
program juangshin;
var
a,b,c:real;
j:integer;
begin
a:=1;
b:=2;
writeln('c:=',a);
writeln('c:=',b);
for j:=1 to 1000 do
begin
c:=b+a;
writrln('c:=',c,);
a:=b;
b:=c;
end;
end.
这个是求的斐波那契数列(依次)
我来回复