请问100!应该怎么算?(180分)

  • 主题发起人 straydog
  • 开始时间
S

straydog

Unregistered / Unconfirmed
GUEST, unregistred user!
请问100!应该怎么算?100的阶层怎么算[:(]
 
太难了吧,有这么大的整型吗
恐怕只能自己造一个了
 
但是好像会超界的呀。记得以前电脑报是什么报纸上曾经有过这样一个问题。
 
算阶乘不用递归吧?
 
呵呵,不是递归,俺错了。
 
不过记得是使用数组什么的。
 
for icount:=0 to 99do
begin
Result:=Result*(100-icount);
end;
 
没错,是需要递归。
刚才写了一小段,没有用递归,发觉写不下去了。
其实原理倒还算简单,就是使用一个字符串数组来保存结果,然后逐个相乘,手工进位。
但是实现起来就比较烦了。
 
哈哈,没用递归搞定了。不过注意呀,你别算1000的阶乘,否则那个数组开的不够大,会蹦叉的。
100的阶乘结果和Windows的计算器对比对了,200的阶乘也可以得到,呵呵。
挺好玩个东西。
procedure TForm1.Button1Click(Sender: TObject);
var
Result_Array: array[0..1000] of Integer;
i, j: Integer;
l_Start: Boolean;
begin
{清空}
for i := 0 to 1000do
Result_Array := 0;
Result_Array[0] := 1;
for i := 1 to 100do
{多少的阶乘100就改成多少}
begin
for j := 0 to 1000do
Result_Array[j] := Result_Array[j] * i;
{所有的都相乘,一次乘100不会超界,因为原来里面仅仅保存1位}
{进位}
for j := 0 to 1000do
begin
if Result_Array[j] >= 10 then
begin
Result_Array[j + 1] := Result_Array[j + 1] + Result_Array[j] div 10;
Result_Array[j] := Result_Array[j] mod 10;
end;
end;

end;

l_Start := False;
for i := 1000do
wnto 0do
begin
if not l_Start then
begin
if Result_Array <> 0 then
l_Start := True;
end;

if l_Start then
RichEdit1.Text := RichEdit1.Text + IntToStr(Result_Array);
end;

end;
 
偶算过2的1000次方。原理差不多。
 
算介称还要用递归?混倒/
 
不是普通的阶乘,是有100多位甚至几百位结果的阶乘,要得出准确结果,不是计算器的那个科学计数法。
不过最后俺还是没有用递归给搞定了,不过用递归可能简单一些,但是不容易理解+编程烦一点。
 
如果你看过高程的书,就知道了,那有个例题
 
很简单嘛
var
i, ecount: integer;
x:do
uble;
begin
ecount :=0;
x := 1;
for i := 1 to 100do
begin
x := x * i;
if x > 10000 then
begin
x := x / 10000;
ecount := ecount+4;
end;
end;
showmessage(floattostr(x)+' E'+inttostr(ecount));
end;
真没想到我这么聪明。估计windows的计算器就是这么算的,只不过我得位数没有windows的计算器那么长
100000000都没问题
 
我测试过了,11111!=2.18375673134771 E29 E40100
当然,实际上结果应该是把E后面的两个数相加 2.18375673134771 E40129
有一点区别,windows的速度太慢了
 
不好意思,在11111! = 2.18375673134771 E40129 的结果里
实际上到第16位就已经和windows的计算器不一样了,可能是double型的精度不够吧
程序改进中......
 
var
i, ecount: integer;
x:do
uble;
begin
ecount := 0;
x := 1;
for i := 1 to 11111do
begin
x := x * i;
while x > 10000do
begin
x := x / 10000;
ecount := ecount + 4;
end;
end;
while x > 10do
begin
x := x / 10;
ecount := ecount + 1;
end;
edit1.Text := floattostr(x) + ' E' + inttostr(ecount);
end;
实在是看不到 2.1837567313477 的下一位了,不知道是不是四舍五入
 
又测试了一次,100000!=2.8242294079604 E456573 (0.1秒)
估计计算器已经算不出来了
。。。
终于算出来了5分钟
计算器的结果是100000!=2.8242294079603478742934215780245e+456573
 
老大,不行的。只能得出:100000!=2.8242294079604 E456573 (0.1秒)。
 
顶部