以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  求 N 阶乘的源码  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=35480)


--  作者:卷积内核
--  发布时间:7/11/2006 10:44:00 AM

--  求 N 阶乘的源码
首先建一基于对话框的窗体,下面给出关键源码:


CNjDlg.cpp

void CNjDlg::OnSave()
{
 const int nSize = 8000;//2000个阶乘空间
 
 int nResult[nSize];
 memset(nResult,0,nSize*sizeof(int));
 UpdateData(TRUE);//取屏幕输入数据
 
 nResult[0] = 1;
 SYSTEMTIME sTime;//系统当前时间(计算耗费时间用)
 GetSystemTime( &sTime );
 WORD fsecond = sTime.wSecond;
 WORD fMsecond = sTime.wMilliseconds;
 int nNeed = atoi(m_count);
 
 while(nNeed)
 {
  for(int i=0; i<nSize; i++)
  {
   if(nResult[i])//阶乘计算
   {
    nResult[i] =  nResult[i] * nNeed;
   }
  }
  
  for(i=0; i<nSize-4; i++)//以数组方式格式化数据
  {
   int nTemp = nResult[i];
   if(nTemp)
   {
    nResult[i] = nTemp%10;
    if(nTemp>=10)
    {
     nResult[i+1] += (nTemp/10)%10;
    }
    
    if(nTemp>=100)
    {
     nResult[i+2] += (nTemp/100)%10;
    }
    
    if(nTemp>=1000)
    {
     nResult[i+3] += (nTemp/1000)%10;
    }
    if(nTemp>=10000)
    {
     nResult[i+4] += (nTemp/10000)%10;
    }
   }
  }
  nNeed--;
  
 }
 
 GetSystemTime( &sTime ); //计算耗费时间
 WORD esecond = sTime.wSecond - fsecond;
 WORD eMsecond = sTime.wMilliseconds - fMsecond;
 CStdioFile sf;//文件方式处理结果
 if(sf.Open("阶乘结果.txt",CFile::modeCreate | CFile::modeNoTruncate |CFile::modeWrite))
 {
  CString strOut;
  int k=0;
  char buffer[20];
  sf.SeekToEnd();
  strOut="\r\n计算 " + m_count + " 的阶乘结果:\r\r\n";
  sf.WriteString(strOut);
  for(int i=nSize-1; i>=0; i--)//去掉前面为零的无效字符
  {
   if(nResult[i])
   {
    break;
   }
  }
  for(i; i>=0; i--,k++)
  {
   if(k%50 == 0)//每行写50的字符
   {
    strOut = "\r\n";
    sf.WriteString(strOut);
   };
   //      _itoa( nResult[i], buffer, 10 );//此处理方式也可以
   sprintf( buffer,"%d", nResult[i] );//此处理方式可以在数字间加空格
   sf.WriteString(buffer);//输出结果
  }
  
  sprintf( buffer,"\r\n耗时: %d 秒 %d 毫秒", esecond, eMsecond );
  sf.WriteString(buffer);
  
  strOut="\r\n=======================================================\r=======================================================\r\n";
  sf.WriteString(strOut);
  
  sf.Close();//关闭文件
  MessageBox("计算成功!","提示",MB_ICONINFORMATION);
 }
 else
 {
  MessageBox("计算失败!","提示",MB_ICONINFORMATION);
 }
}


--  作者:xm_hcyoo
--  发布时间:7/21/2006 1:11:00 AM

--  
这么麻烦.我用C几步就编好啦.呵呵
--  作者:xm_hcyoo
--  发布时间:7/21/2006 1:11:00 AM

--  
这么麻烦.我用C几步就编好啦.呵呵
--  作者:elfstone
--  发布时间:7/21/2006 12:04:00 PM

--  
楼上的有仔细看过源码么?
--  作者:wx851205
--  发布时间:7/22/2006 11:05:00 PM

--  
??? 怎么编译的时候出现错误?
--  作者:gln
--  发布时间:7/23/2006 8:17:00 PM

--  
我这也是
--  作者:卷积内核
--  发布时间:8/10/2006 1:04:00 PM

--  
以下是引用wx851205在2006-7-22 23:05:00的发言:
??? 怎么编译的时候出现错误?


VC环境下编译的
--  作者:卷积内核
--  发布时间:8/10/2006 1:09:00 PM

--  
以下是引用xm_hcyoo在2006-7-21 1:11:00的发言:
这么麻烦.我用C几步就编好啦.呵呵

结果如下:


计算 50 的阶乘结果:


30414093201713378043612608166064768844377641568960

512000000000000

耗时: 0 秒 0 毫秒

=======================================================
=======================================================

计算 500 的阶乘结果:


12201368259911100687012387854230469262535743428031

92842192413588385845373153881997605496447502203281

86301361647714820358416337872207817720048078520515

93292854779075719393306037729608590862704291745478

82424912726344305670173270769461062802310452644218

87878946575477714986349436778103764427403382736539

74713864778784954384895955375379904232410612713269

84327745715546309977202781014561081188373709531016

35632443298702956389662891165897476957208792692887

12817800702651745077684107196243903943225364226052

34945850129918571501248706961568141625359056693423

81300885624924689156412677565448188650659384795177

53608940057452389403357984763639449053130623237490

66445048824665075946735862074637925184200459369692

98102226397195259719094521782333175693458150855233

28207628200234026269078983424517120062077146409794

56116127629145951237229913340169552363850942885592

01872743379517301458635757082835578015873543276888

86801203998823847021514676054454076635359841744304

80128938313896881639487469658817504506926365338175

05547812864000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000

耗时: 0 秒 47 毫秒

=======================================================
=======================================================

计算 2000 的阶乘结果:


33162750924506332411753933805763240382811172081057

80394571935437060380779056008224002732308597325922

55402352941225834109258084817415293796131386633526

34368890563405855616394060511725257187064785639354

40454052439574670376741087229704346841583437524315

80877533645127487995436859247408032408946561507233

25065279765575717967153671868935905611281587160171

72326571561100042140124204338425737127001758835477

96899921283528996665853405579854903657366350133386

55040117201215263548803826815215224692099520603156

44185654806759464970515522882052348999957264508140

65536678969532101467622671332026831552205194494461

61823927520402652972263150257475204829606475092739

41658562835317795744828763145964503739913273341772

63608852490093506621610144459709412707821313732563

83157230201994991495831647094277447387032798554967

42986088393763268241524788343874695958292577405745

39837501585815468136294217949972399813599481016556

56387603422731291225038470987290962662246197107660

59315502018951355831653578714922909167790497022470

94611937607785165110684432255905648736266530377384

65039078804952460071254940261456607225413630275491

36715834060978310749452822174907813477096932415561

11339828051358600690594619965257310741177081519922

56451677857145805660218565476095237746301667942248

84444857983498015480326208298909658573817518886193

76692828279888453584639896594213952984465291092009

10371004614944991582858805076186792494638518087987

45128914080193400746259200570987295785996436506558

95612410231018690556060308783629110505601245908998

38341079936790205207685866918347790655854470014869

26569246319333376124280974200671728463619392496986

28468719993450393889367270487127172734561700354867

47750910295552395354794110742191330135681954109194

14627664175421615876252628580898012224438902486771

82054959415751991701271767571787495861619665931878

85514183578209260148207177733173539603430496908207

05899587013819808130355901607629083885745612882176

98136182483576739218303118414719133986892842344000

77924669120976673165143349443747323563657204884447

83318549416930301245316762327453678793228474738244

85092283139952509732505979127031047683601481191102

22925337269769382367005756561240029057604385285290

29376064795334581796661238396052625491071866638693

54766108455046198102084050635827676526589492393249

51968595417167241932953068367349554400458635983816

10430594498266275306054235807558941082788804278259

51089880635410567917950974017780688782869810219010

90014835206168888372025031066592206860148364983053

27820882635365580436056867812841692171330471411763

12175895777122637584753123517230990549829210134687

30420589801441806387538266416989770423775940628087

72537022654265305808623793014226758211871435029186

37636340300173251818262076039747369595202642632364

14544685111342720215045838385101013694131303485622

19166316238926327658153550112763078250599691588245

33457435437863683173730673296589355199694458236873

50883027865770087974988999234355556624068283476378

46851838449736488739524751032242221105612012958296

57191368108693825475764118886879346725191246192151

14473883626959164367249007165342822815266124780046

39225449451703637236279407577845420910483054616561

90622174286981602973324046520201992813854882681951

00728286970107073750092766648750217477537274235150

87482467202741700315811228058961781221607474379475

10950620938556674581252518376682157712807861499255

87613235295042234638787895485088576446613629039412

76659780442020922813379871159008962648789424132104

54925003566670632909441579372986743421470507213588

93201958072306478149842952259558901275482397177332

57229103257609297907332995450563883626404746502450

80809469116072632087494143973000704111418595530278

82735765481918200244969776111134631819528276159096

41897909581173386272060889104329452449785351470141

12442143055486089639578378347325323595763291438925

28839398625627324286277556314046383038916842163311

34456363095719659784663385514923161963356753551384

03425804162919837822266909521770153175338730284610

84188655413832917195133211789572854166208482368281

79325129312375215419269702697032994776438233864830

08871530373405666383868294088487730721762268849023

08493466119426018027261380210800507821574100605484

82013478595781027707077806555127725405016743323960

66253216415004808772403047611929032210154385353138

68553848642557079079534117651957118868373988068389

57927437496834981429232921963097770901439368436553

33359307820181312993455024206044563340578606962471

96150560339489952332180043435996725662392719643540

28720554750120798543319706747973131268135236537440

85662263206768837585132782896252333284341812977624

69707954343600349234315923967476363891211528540665

77836462139112474470512552263427012395270181270454

91648045932248108858674600952306793175967755581011

67994000524980630376314134441226903703498735579991

60092592480750524855415682662817608154463083054066

77412630124441864204108373119093130001154470560277

77372437806718889977085105672727678124719883285769

58442175888951604678682048100100478164623582208385

32488134270834079868486632162720208823308727819085

37884546913155602172887312190739396520926022910147

75270809308653649798585540105774502792898146036884

31821508637246216967872282169347370599286277112447

69092090298832016683017027342025976567170986331121

63495021712644268271196502640542282317596308744753

01847194095524263411498469508073390080000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000

000000000000000000000000000000000000

耗时: 1 秒 654 毫秒

=======================================================
=======================================================


[此贴子已经被作者于2008-7-26 17:02:49编辑过]

--  作者:luheng
--  发布时间:8/11/2006 3:40:00 PM

--  

--  作者:cpplab
--  发布时间:8/17/2006 10:03:00 AM

--  
代码不完整,使用了UpdateData就应该列出相关的update变量。
程序没有动态考虑阶乘的最大值,纯粹使用阿婆算法。
--  作者:x19103125
--  发布时间:8/17/2006 4:33:00 PM

--  
虽说比较全面!好多问题考虑得很细,不过还是很麻烦!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
109.375ms