实现如下功能
function Tform1.an(n: Integer) :Longint;
begin
if 0 = n then
begin
result := 1;
exit;
end;
result := n*an(n-1);
end;
这个最多能算16!,我想要一个类似windows上的calc那个阶乘算法,比如
20!=2432902008176640000
55!=1.2696403353658275925965100847567e+73
求实现算法或者构思
function Tform1.an(n: Integer) :Longint;
begin
if 0 = n then
begin
result := 1;
exit;
end;
result := n*an(n-1);
end;
这个最多能算16!,我想要一个类似windows上的calc那个阶乘算法,比如
20!=2432902008176640000
55!=1.2696403353658275925965100847567e+73
求实现算法或者构思
解决方案 »
- (你也来说说吧) 如何减小Delphi 2010 编写应用程序体积.
- dbgrideh HideDuplicates :=True 时如何让选中的行全行颜色变色?
- access violation at address 6F747475. read of address 6F747475.错误!
- 测试...
- 有关套打的问题??我用Qreport控件怎么样去设置默认纸张的大小??
- 求float保留两位小数的问题急急急急急!!!!!!!!!!
- 详情 请见http://expert.csdn.net/Expert/topic/2350/2350935.xml?temp=.7315943 重谢
- delphi6,后台oracle8,用什么连接好呢?
- 伴水请进!(100分)
- 如何杀死线程
- 请问VC中的CString s;i=0xef;s.Format("%02x",i);在dephi中该怎么实现?谢谢
- 怎麼解決DATASET NOT IN EDITOR OR INSERT ?
begin
Result := Copy(mStr, 1, Pos(mDelimiter, mStr) - 1);
end; { StrLeft }function StrRight(const mStr: string; mDelimiter: string): string;
begin
if Pos(mDelimiter, mStr) <= 0 then
Result := ''
else Result := Copy(mStr, Pos(mDelimiter, mStr) + Length(mDelimiter), MaxInt);
end; { StrRight }function InfiniteAdd(mNumberA, mNumberB: string): string; { 无限位数加法 }
var
I: Integer;
T: Integer;
begin
Result := '';
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
I := Max(Length(StrLeft(mNumberA, '.')), Length(StrLeft(mNumberB, '.'))); //整数部分最大长度
mNumberA := StringOfChar('0', I - Length(StrLeft(mNumberA, '.'))) + mNumberA; //整数前补0
mNumberB := StringOfChar('0', I - Length(StrLeft(mNumberB, '.'))) + mNumberB; //整数前补0
T := Max(Length(StrRight(mNumberA, '.')), Length(StrRight(mNumberB, '.'))); //小数部分最大长度
mNumberA := mNumberA + StringOfChar('0', T - Length(StrRight(mNumberA, '.'))); //小数后补0
mNumberB := mNumberB + StringOfChar('0', T - Length(StrRight(mNumberB, '.'))); //小数后补0
I := I + T + 1; //计算总长度//小数长度和整数长度加上小数点长度
T := 0; //进位数初始化
for I := I downto 1 do //从后向前扫描
if [mNumberA[I], mNumberB[I]] <> ['.'] then begin //不是小数点时
T := StrToIntDef(mNumberA[I], 0) + T; //累加当前数位
T := StrToIntDef(mNumberB[I], 0) + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end else Result := '.' + Result; //加上小数点
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
while Pos('0', Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
while Copy(Result, Length(Result), 1) = '0' do
Delete(Result, Length(Result), 1); //排除小数后无效的0
if Copy(Result, Length(Result), 1) = '.' then
Delete(Result, Length(Result), 1); //排除无效小数点
if Copy(Result, 1, 1) = '.' then Result := '0' + Result; //处理无0小数情况
if (Result = '') then Result := '0'; //处理空字符情况
end; { InfiniteAdd }function InfiniteMult(mNumberA, mNumberB: string): string; { 无限位数乘法 } function fMult(mNumber: string; mByte: Byte): string; { 无限位数乘法子函数 }
var
I: Integer;
T: Integer;
begin
Result := '';
T := 0;
for I := Length(mNumber) downto 1 do begin //从后向前扫描
T := StrToIntDef(mNumber[I], 0) * mByte + T; //累加当前数位
Result := IntToStr(T mod 10) + Result; //计算当前数位上的数字
T := T div 10; //计算进位数
end;
if T <> 0 then Result := IntToStr(T mod 10) + Result; //处理进位数
end; { fMult }var
I: Integer;
vDecimal: Integer; //小数位数
T: string;
begin
Result := '';
///////Begin 处理小数
if Pos('.', mNumberA) <= 0 then mNumberA := mNumberA + '.'; //没有有小数点补小数点
if Pos('.', mNumberB) <= 0 then mNumberB := mNumberB + '.'; //没有有小数点补小数点
vDecimal := Length(StrRight(mNumberA, '.')) + Length(StrRight(mNumberB, '.')); //计算小数位数
mNumberA := StrLeft(mNumberA, '.') + StrRight(mNumberA, '.'); //删除小数点
mNumberB := StrLeft(mNumberB, '.') + StrRight(mNumberB, '.'); //删除小数点
///////End 处理小数
T := '';
for I := Length(mNumberB) downto 1 do begin
Result := InfiniteAdd(Result, fMult(mNumberA, StrToIntDef(mNumberB[I], 0)) + T);
T := T + '0';
end;
Insert(StringOfChar('0', vDecimal), Result, 1); //向前补零
Insert('.', Result, Length(Result) - vDecimal + 1); //将小数还原
while Pos('0', Result) = 1 do Delete(Result, 1, 1); //排除整数前无效的0
while Copy(Result, Length(Result), 1) = '0' do
Delete(Result, Length(Result), 1); //排除小数后无效的0
if Copy(Result, Length(Result), 1) = '.' then
Delete(Result, Length(Result), 1); //排除无效小数点
if Copy(Result, 1, 1) = '.' then Result := '0' + Result; //处理无0小数情况
if (Result = '') then Result := '0'; //处理空字符情况
end; { InfiniteMult }function InfiniteFactorial(mNumber: Integer): string; { 无限位数阶乘 }
var
I: Integer;
begin
Result := '1';
for I := 1 to mNumber do
Result := InfiniteMult(Result, IntToStr(I));
end; { InfiniteFactorial }//Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := InfiniteFactorial(55);
end;55!=12696403353658275925965100847566516959580321051449436762275840000000000000
155!=4789142901463393876335775239063022722176295591337767174070096339929153381622433264146569329274347655956110484372311586936020749175429076661003216274382475477806479918110524333880196139452687559896255940215628508414806740389616633144934400000000000000000000000000000000000000
29!=8841761993739701954543616000000
而且我想要这样的结果
55!=1.2696403353658275925965100847567e+73
是不是需要用到数组,或者需要忽略部分数?
用什么数据类型可以存放的下如:
8841761993739701954543616000000或
2696403353658275925965100847567 这么长的数?