我用FreePascal写的阶乘递归函数执行失败

来源:百度知道 编辑:UC知道 时间:2024/04/28 13:30:06
program fac(output,input);
var
n,b,c:integer;

function fac(n:integer):integer;
begin
if n=1 then fac:=1
else fac:=fac(n-1)*n;
end;{function}

begin
read(b);
c:=fac(b);
writeln (c);
end.

这个程序很简单,我也没在意,可是执行后就会出下如下意想不到的效果:
输入 1 - 7 都还正常
输入 8 以后就出现问题了:
==========================
输入 | 输出
7 5040
8 -25216
9 -30336
56 0
==========================
编译环境 FPC for Linux_x86 under Ubuntu

溢出了
因为interger类型占用2字节的储存空间,最多可以表示从-32768到32767的整数。
换成longint会好点
但是到39(好象是)的时候也会出错了。

数据范围开得太小了,用longint就行了。从8开始,数据超过了65535,越界了。
var
n:longint;
function di(n:longint):longint;
begin
if n=1
then di:=1
else di:=di(n-1)*n;
end;
begin
read(n);
writeln(di(n));
end.