绝对技术性问题(10000!)(100分)

  • 主题发起人 diamond001
  • 开始时间
D

diamond001

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何计算出10000的阶乘并将其显示出来,请给出代码!
 
W

wjiachun

Unregistered / Unconfirmed
GUEST, unregistred user!
就是循环或递推的算法,数太大了用数组表示结果,至于代码懒得写了
反正大二学Pascal时写过类似的例子
 

秋之叶

Unregistered / Unconfirmed
GUEST, unregistred user!
Function CalcNum(mValue:Integer):Integer;
Var
mRes:Integer;
begin
mRes := 1;
for i:=1 to mValuedo
mRes := i*mRes;
Result := mRes;
end;
 
M

mikedeakins

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上的,我想踢你。:)
wjiachun 算幸运了,我们是学 ASM 的时候写的这个例子……
 
W

wjiachun

Unregistered / Unconfirmed
GUEST, unregistred user!
mikedeakins:
帮我也踢他一脚 :)
 
D

doxpix

Unregistered / Unconfirmed
GUEST, unregistred user!
这么一个算法的好练习题,为什么不自己做呢?
等Success后,那种成就感是别人不能满足你的。
Do It Yourself!!!
 
H

han

Unregistered / Unconfirmed
GUEST, unregistred user!
10000的阶乘很大的,在Delphi里用已有的数据类型估计要溢出
 
G

gzpbx

Unregistered / Unconfirmed
GUEST, unregistred user!
到底能大到多少呢?如果小于255位,可以用字符串做!
我初中时做过,如果还不会我一会儿给你做一个!
 

刃血

Unregistered / Unconfirmed
GUEST, unregistred user!
慢着,我也来一脚!!
 
G

gzpbx

Unregistered / Unconfirmed
GUEST, unregistred user!
你来一脚干什么?是想解决问题,还是看别人来解决问题!
 
C

cm

Unregistered / Unconfirmed
GUEST, unregistred user!
1000!
远远超过255位
所以可以用数组来存放每一位
然后用要乘的数字去乘每一位,把结果在放在数组中。
 
K

knightlzf

Unregistered / Unconfirmed
GUEST, unregistred user!
可以用字符串做,也可以把它缩小.可以把他的值除以10的几百次方
 
J

jiichen

Unregistered / Unconfirmed
GUEST, unregistred user!
階層為 n*(n-1)*(n-2)*...*2*1
一般小數目只需使用
rr:=1;
for i := 10do
wnto 1do
begin
rr:=rr*i;
end;
// for
便可算出,此題的問題在於數目太大,會溢位。
5!=120
10!=3628800
所以目前在考慮 cm 的算式。
 
F

Fyx

Unregistered / Unconfirmed
GUEST, unregistred user!
10000!何止255位?有35660位!看来得用数组了
以下代码,只是把它用科学计数法表示出来:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
t, a, b: Real;
begin
t := 0;
for i := 1 to 10000do
t := t + ln(i);
t := t/ln(10);
a := int(t);
b := exp(frac(t) * ln(10));
Caption := FloatToStr(b) + 'E+' +IntToStr(Trunc(a));
end;
 
D

diamond001

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:我知道数目小的时候,做起来很方便,我也知道用循环做,关键就是数字大,所以
我才让大家想个方法,将它显示出来,当然最好是全部用阿拉伯数字表示,不用科学计数法,
我会试验上面两位高贤的方法,如果可以就分配分数,当然如果还有答案,可以继续加分,
千万不要只说不练,
 
L

LanFairy

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位应看好再说,我看过一篇资料说过,如果直接计算决对不行。今天没时间有时间我可以
贴出来大家看一下
 
G

gzpbx

Unregistered / Unconfirmed
GUEST, unregistred user!
我给你做出来了!
function TForm1.Adding(st1, st2: WideString): WideString;
var
st, str1, str2: WideString;
i, last, digit: Integer;
begin
str1 := '';
str2 := '';
if length(st1) > length(st2) then
last := length(st1)
else
last := length(st2);
for i := length(st1)do
wnto 1do
str1 := str1 + st1;
for i := length(st1)+1 to lastdo
str1 := str1 + '0';
for i := length(st2)do
wnto 1do
str2 := str2 + st2;
for i := length(st2)+1 to lastdo
str2 := str2 + '0';
st := '';
digit := 0;
for i := 1 to lastdo
begin
digit := ord(str1) + ord(str2) - 96 + digit;
st := st + chr((digit mod 10)+48);
digit := digit div 10;
end;
if digit>0 then
st := st + '1';
str1 := '';
for i := length(st)do
wnto 1do
str1 := str1 + st;
result := str1;
end;

function TForm1.Mult_One(sts: WideString;
ch: widechar): WideString;
var
str, st: WideString;
i, digit: Integer;
begin
str := '';
for i := length(sts)do
wnto 1do
str := str + sts;
digit := 0;
st := '';
for i := 1 to length(str)do
begin
digit := (ord(str) - 48) * (ord(ch) - 48) + digit;
st := st + chr((digit mod 10)+48);
digit := digit div 10;
end;
if digit>0 then
st := st + IntToStr(digit);
str := '';
for i := length(st)do
wnto 1do
str := str + st;
result := str;
end;

function TForm1.Mult(st1, st2: WideString): WideString;
var
str2, st: WideString;
i, L: Integer;
begin
st := '';
L := length(st2);
str2 := '';
for i := 1 to Ldo
begin
st := Adding(st,str2);
str2 := Mult_one(st1,st2);
st := st + '0';
end;
st := Adding(st,str2);
result := st;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
st: WideString;
i: Integer;
begin
//Memo1.Clear;
Memo1.Lines.Add('123+'+Edit1.Text+'='+Adding('123',Edit1.Text));
Memo1.Lines.Add('9*'+Edit1.Text+'='+Mult_One(Edit1.Text,'9'));
Memo1.Lines.Add('23*'+Edit1.Text+'='+Mult('23',Edit1.Text));
st := '1';
for i := 1 to StrToInt(Edit1.Text)do
begin
st := Mult(st,IntToStr(i));
Application.ProcessMessages;
end;
Memo1.Lines.Add(st);
Memo1.Lines.Add('');
end;

结果:(很长很长)
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 
G

gzpbx

Unregistered / Unconfirmed
GUEST, unregistred user!
给我加分呀!
我是斑竹!!
 
X

xuyingfeng

Unregistered / Unconfirmed
GUEST, unregistred user!
gzpbx的方法真性!
1000!我用了10分钟是
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
不止到10000!你用了多长时间呢???
 
B

bbboy

Unregistered / Unconfirmed
GUEST, unregistred user!
其实算法非常简单,但是还是可以有值得推敲的地方,可以有很多值得推敲的地方,可以找找规律。
可以使程序块很多,比如所乘对象是10,5,100,500,1000,5000,55,555,等的时候就没有
必要真正进行运算,还有比如说99,999这样的数字,就不用真正的去运算了,当然有很多的规律
可以找,呵呵。咱们大家是不是都来显示一下伸手,看看谁写的程序的运算时间最短。
 
顶部