N!用Delphi 如何写?(20分)

  • 主题发起人 主题发起人 why_119
  • 开始时间 开始时间
W

why_119

Unregistered / Unconfirmed
GUEST, unregistred user!
N!用Delphi 如何写?
 
把它翻译一下就行了。

Private Function cacl(num As Long) As String
Dim numlen As Long, last As Long, x As Long
Dim i As Long, m As Long, n As Long
Dim result() As Long, starttime As Single
numlen = 1
starttime = Timer
ReDim result(1 To numlen)
result(1) = 1
x = 1
Do While x <= num
last = 0
For i = 1 To numlen
m = result(i) * x + last
result(i) = m Mod 10
last = m / 10
Next
If last > 0 Then
n = Len(CStr(last))
ReDim Preserve result(1 To numlen + n)
For i = 1 To n
result(numlen + i) = last Mod 10
last = last / 10
Next
numlen = UBound(result)
End If
x = x + 1
Loop
ReDim s(1 To numlen)
For i = 1 To numlen
s(i) = result(numlen + 1 - i)
Next
cacl = Join(s, "")
Debug.Print num &amp
"! : 用时 "
Timer - starttime &amp
" 秒, 结果 " &amp
numlen &amp
" 位"
End Function

Private Sub Command1_Click()
Dim i As Long
For i = 1 To 10
cacl i * 100
Next
'For i = 1 To 10
'cacl i * 1000
'Next
End Sub

赶紧结贴吧。
 
楼主是要一般的还是高精度的?
 
试写一下,请大家验证看对不对?
function Ndejiecheng( n : integer):integer;
begin
if n < 0 then
begin Result := 0
showmessage('非法数值!')
exit
end

//上面是容错处理,下面是递归算法
if (n = 0) then Result := 1
else Result := n * Ndejiecheng(n - 1);
end;
 
var
n,j,i:longint;
begin
n:= StrToIntdef(Edit1.text,0);
j:=1;
for i:= 1 to n do j:=j*i;
Edit2.Text := IntToStr(j);
end;
我的Delphi突然不能用了,上述代码没有测试。[:(]
 
问个题外话:为什么Windows的计算器算出来的数值可以达到这么大:
9999!=2.846e+35656,还可以更大,我没有再测试。
 
program Project1;

{$APPTYPE CONSOLE}

uses
ExceptionLog,
SysUtils;

function Fact(n : integer):double;
begin
if( n = 0 ) then Result := 1
else
Result := n * Fact(n - 1);
end;


begin
writeln(Fact(20));
readln;
end.
 
好像这个要用到递归吧!我以前在很老的书里看过的,是潭浩强的,用递归好做一点有几行的代码吧!那种pascal教程里可能还有这个答案的吧!
 
to bjaman,
用你的程序,算一下10000!试试看。
 
uses FMTBcd;

function JC(N:Integer):TBcd;
begin
if N<0 then begin Result:=IntegerToBcd(0);Showmessage('非法数值!');exit;end;
if N=0 then Result:=IntegerToBcd(1)
else BcdMultiply(JC(N-1),N,Result);
end;

procedure TForm1.Button1Click(Sender: TObject);
var I:TBcd;
begin
I:=JC(10000);
ShowMessage(BCDToStr(I));
end;
 
对于阶乘的问题,要用到字符数组的!
 
to lanbinvivy: 我是在网吧里上网,写着玩的,没办法试了....呵呵~~~~~~只是个示意而已.要扩展数据范围,就照TYZHANG的做吧~~~~~~~~~~~~~~

function Ndejiecheng( n : integer):Extended;//把函数返回值由整数扩大到实数
begin
if (n = 0) then Result := 1
else Result := n * Ndejiecheng(n - 1);
end;
Extended型数的最大值为1.1X10^4932,有效数字位为19~20位,占10个字节。
此时此函数最大可以求出1754的阶乘,即1754!=1.97926189010501E4930,这也许是Delphi能求出的最大的阶乘数值了!
此取值范围经过测试!
 
只能算到49!
往后就会报错:
"BCD overflow"!
往后怎么算呢?
 
用我前面说的,算到 1000!陡没问题
 
后退
顶部