主题:[讨论]Fibonacci数列问题。
lierenpascal
[专家分:0] 发布于 2007-07-24 17:38:00
Fibonacci数列问题:数列的头两个数分别为0,1,从第三个开始,每个数皆为它的前面
两个数之和,即:0,1,1,2,3,5……输出该数列的前100个数。
谢谢~!!
回复列表 (共6个回复)
沙发
Matodied [专家分:7560] 发布于 2007-07-24 19:13:00
我用的是迭代(不过到后面由于数字过大显示就不准了)。
VAR
i: INTEGER;
a, b, c: REAL;
BEGIN
a := 0; b := 1; WRITE(a:10:0 , ' ', b:10:0, ' ');
FOR i:=3 TO 100 DO BEGIN
c := a + b; WRITE(c:10:0, ' ');
a := b; b := c;
END;
END.
板凳
bigchen [专家分:1940] 发布于 2007-07-24 19:16:00
楼上的,你错了
最后的结果是354224848179261915075
显然超过了integer,longint,int64,qword所能表示的范围
所以必须要用到高精度计算
3 楼
Matodied [专家分:7560] 发布于 2007-07-24 21:14:00
可是我用的是REAL类型(楼上的,哪有QWORD这个类型?)。
高精度是这样做的:设立一个高精度加法的函数:gjdadd(x,y),其中x、y是字符串。
程序:
FUNCTION gjdadd(x, y: STRING): STRING;
TYPE arr = ARRAY[1..127] OF INTEGER;
VAR
a, b, s: arr; z, zz: STRING[126];
i, lx, ly, l, k, t: INTEGER;
BEGIN
FOR i:=1 TO 127 DO BEGIN
a[i] := 0; b[i] := 0; s[i] := 0;
END;
lx := LENGTH(x); ly := LENGTH(y);
IF lx > ly THEN l := lx ELSE l := ly;
FOR i:=1 TO lx DO VAL(COPY(x, lx + 1 - i, 1), a[i], k);
FOR i:=1 TO ly DO VAL(COPY(y, ly + 1 - i, 1), b[i], k);
FOR i:=1 TO l DO BEGIN
s[i] := s[i] + a[i] + b[i];
IF s[i] >= 10 THEN BEGIN
s[i + 1] := 1; s[i] := s[i] MOD 10;
END;
END;
IF s[l + 1] = 0 THEN t := l ELSE t := l + 1;
z := '';
FOR i:=t DOWNTO 1 DO BEGIN
STR(s[i], zz); z := z + zz;
END;
gjdadd := z;
END;
VAR
i: INTEGER;
a, b, c: STRING;
BEGIN
a := '0'; b := '1'; WRITE(a, ' ', b, ' ');
FOR i:=3 TO 100 DO BEGIN
c := gjdadd(a, b); WRITELN(c, ' ');
a := b; b := c;
END;
END.
楼上说的那个数已经是第101项了,第100项是:218922995834555169026.
4 楼
bigchen [专家分:1940] 发布于 2007-07-24 21:56:00
在free pascal里有qword类型
可以表示到2^64-1
5 楼
angwuy [专家分:2280] 发布于 2007-07-25 07:36:00
听说FP中还有一个类型叫做tbyte,能表示-2^79~2^79-1,但不知道怎么用
6 楼
lierenpascal [专家分:0] 发布于 2007-07-25 08:18:00
恩,Matodied的第一个程序显然有些错误。[em12]因为用的是实型,结果显得乱。至于高精度运算,我有点不懂。不过先复制一下Matodied的第二个程序了。~!!
感谢大家的帮助,特别是Matodied!![em3][em3][em2]
我来回复