<font color=#FF0000>请教一个简单的问题</font>(100分)

  • 主题发起人 主题发起人 ewind
  • 开始时间 开始时间
E

ewind

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如果想算10000的阶乘,结果要用什么数据类型啊?LongWord肯定是不够的了。
Windows的计算器的计算结果为 2.846E+35659.
 
自己用数组吧,这是一种简单常用的办法。
 
哦,小弟是Delphi新手,举个例子给我吧,谢谢
 
你有没有学过其他的语言?这个都是差不多的。
 
随便找本书,里面一般都有讲如何用数组计算两个大数的乘法。照猫画虎即可。
 
用字符串
 
我找了几本书,没找到,哪位大虾有空帮我找找,贴给我吧,谢谢
 
你手算是怎么算的?编个程序模拟首选就行了。
 
如果用C的话,用双向指针链表就能解决。
 

用mathematica就行,可能要等一会。
 
基本算法使用数组,数组的一个元素代表一位。
 
改成浮点数运算,每个数都除以10000(用x,y分别表示底和幂)
x:real;
y:integer;
x:=1.0;
y:=0;
for i:=10000do
wnto 1do
begin
x:=x*i/10000.0
y:=y+4;
j:=0;
while x<1do
begin
x:=x*10.0;
j:=j+1;
end;
y:=y-j;
end;
win2000+delphi5+pIII500+64M运行不超过1秒。
 
开一个数组,元素个数大于结果的有效位数,用BCD码存储,按位计算;
hhzh426的办法看起来很简单,可是没有考虑截断误差,那几乎是用对数计算了,
原理就像老早用的计算尺,精度要受影响的。
 
不知道你想知道什么样的结果
1.如果想知道10000阶乘的每一位,那么只有用数组,采用高精度的算法来计算
2.如果只想知道10000 阶乘的位数那就很简单了,log1+log2+...+log10000
3.如果想知道10000阶乘的最末几位数,用循环做乘法,每一次计算的结果只用
保留最末的N位数,N的计算是和10000相关的.
总之,具体问题具体解决
 
我就想得到 n!=2.846E+35659 这样的结果
 
那太容易了,写一个程序给你,只要6字节浮点就可以搞定
var f, f1, f2: real;
i: integer;
begin
f := 0;
for i := 1 to 10000do
f := f + ln(i);
f := f/ln(10);
f1 := int(f);
f2 := exp(frac(f) * ln(10));
end;
 
to hhzh426:
谢谢您的帮助,可是您的程序好象是得不到10000!的幂
to iie:
谢谢,您的程序也得不到n!=2.846E+35659这样的结果
 
你没仔细看吧,f1里是指数部分,结果是35659
f2里是底,结果是2.84626719733569。这还不行?你到底要什么?
 
用字符串自己写
 
后退
顶部