主题:一个“!”的运算
huiyu789
[专家分:0] 发布于 2005-10-02 21:41:00
朋友,请问 1!+2!+……100!=????????
如何调试这个程序???
谢谢··
回复列表 (共17个回复)
11 楼
xlsp [专家分:20] 发布于 2005-10-05 20:20:00
100!已经超过了32位机器所能表示的整数大小了!!但是求阶乘的和还是可以的!!
1楼的没有求和!3楼和7楼的都错了!!!因为a[i]没有赋初值!正确的程序应该如下:
var
i:integer;
a:array[1..100] of longint;
x:longint;
begin
a[1]:=1;
x:=a[1];
for i:=2 to 100 do
begin
a[i]:=a[i-1]*i;
x:=x+a[i];
end;
end.
12 楼
阿Ben [专家分:2200] 发布于 2005-10-05 23:24:00
咦?我发现……
楼主问的是“如何调试这个程序???”
请各位看清楚:是“调试”啊!
也就是说,楼主已经把程序编出来了,但运行时出错,而且不懂得如何调试这程序。
楼主,如果我推理正确,请把你编的程序贴上来;如果我推理错误,也希望你表个态。
13 楼
风花雪月☆雨 [专家分:460] 发布于 2005-10-06 17:57:00
也许他说调试只是语言上的习惯,并没有编出来。就像我用电脑总是说玩电脑
14 楼
游侠UFO [专家分:1200] 发布于 2005-10-06 19:18:00
很明显,PASCAL中没有任何一种数据类型能表示这么大的数。我个人认为使用高精度是比较好的方法
15 楼
阿Ben [专家分:2200] 发布于 2005-10-06 22:08:00
是啊,用高精度。但不知会不会超时呢?
16 楼
林记 [专家分:1680] 发布于 2005-10-06 22:57:00
我有个比较简单的方法,只要做n-2次乘法和n-1次加法,100的话绝对不会超时
不过以下程序没有经过测试
const
n=100;
var
a:array [0..300] of integer;
i:integer;
procedure jw;
var
i:integer;
begin
i:=1;
while (a[i]>0)or(i<=a[0]) do
begin
inc(a[i+1],a[i] div 10)
a[i];=a[i] mod 10;
inc(i);
end;
a[0]:=i-1;
end;
procedure gc(n:integer);
var
i:integer;
begin
for i:=1 to a[0] do
a[i]:=a[i]*n;
jw;
end;
begin
a[0]:=1;
a[1]:=n+1;
for i:=n-1 downto 2 do
begin
gc(i);
inc(a[1]);
end;
jw;
for i:=1 to a[0] do
write(a[i]);
end.
17 楼
fxzxg [专家分:430] 发布于 2005-10-07 08:51:00
extended 是什么东东?????
我来回复