回 帖 发 新 帖 刷新版面

主题:[讨论]菲波那契数列 pascal !

题目描述 

菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。

给出一个正整数a,要求菲波那契数列中第a个数是多少。


输入 

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 20) 

输出 

输出有n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数的大小 

样例输入 

4

5

2

19

1

样例输出 

5

1

4181

1

回复列表 (共10个回复)

沙发

如果不使用计算公式,那么最笨的办法就是一个一个加。。。

板凳

直接交表即可。
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 楼

呵呵,终于想起来这个数列与什么有关了~~~
与黄金分割有关,它的通项公式为:
sq5:=sqrt(5.0)
f(n):=((0.5+sq5/2.0)**n-(0.5-sq5/2.0)**n)/sq5

n从0开始:)

4 楼

咨询楼上:若n巨大,有没有二分的方法求??

5 楼

如果巨大,则此法就不合适了,因为超出了浮点数所能表达的最多有效位数,则你就取不出实际的整数了。

6 楼

这里是斐波那契额数列不是n次方,我认为不能二分。
如果n比较大那么高精度。

7 楼

当使用双精度时:
n小于等于75时,结果的整数部分是精确的(2111485077978055);n为76时,结果的整数部分则开始会有误差了(3416454622906716:比实际结果大1)
:)
如果需要计算76及以上的结果时,可以以74与75的结果为基准进行计算:)

8 楼

我不知道楼上是按照什么公式计算的,是不是上面那个带根号的式子。
但可以肯定地是,由于实型(包括real, double等)不可避免的会有误差,所以,大数字的计算还是必须使用高精度,否则必然会导致错误。
实型的存储使用的是底数*10^指数的形式保存的,由于计算机的离散性,实际上是在用每个区间上的中间值来近似代替这个区间上的所有数,所以出现误差也是不可避免的。

9 楼

当然是用我回复的公式来计算的啦,在n为76以前,双精度还是够的。
菲波那契级数实际上跟黄金分割有关,在n为76以后再使用高精计算才是有必要的,否则只是白白浪费机时而已:)

10 楼

没那么麻烦
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.
这个是求的斐波那契数列(依次)

我来回复

您尚未登录,请登录后再回复。点此登录或注册