回 帖 发 新 帖 刷新版面

主题:[讨论]Fibonacci数列问题。

Fibonacci数列问题:数列的头两个数分别为0,1,从第三个开始,每个数皆为它的前面
两个数之和,即:0,1,1,2,3,5……输出该数列的前100个数。
谢谢~!!

回复列表 (共6个回复)

沙发

我用的是迭代(不过到后面由于数字过大显示就不准了)。
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.

板凳

楼上的,你错了
最后的结果是354224848179261915075
显然超过了integer,longint,int64,qword所能表示的范围
所以必须要用到高精度计算

3 楼

可是我用的是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 楼

在free pascal里有qword类型
可以表示到2^64-1

5 楼

听说FP中还有一个类型叫做tbyte,能表示-2^79~2^79-1,但不知道怎么用

6 楼


恩,Matodied的第一个程序显然有些错误。[em12]因为用的是实型,结果显得乱。至于高精度运算,我有点不懂。不过先复制一下Matodied的第二个程序了。~!!
感谢大家的帮助,特别是Matodied!![em3][em3][em2]

我来回复

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