计算1977!

来源:互联网 发布:mac lol 国服下载 编辑:程序博客网 时间:2024/04/29 16:36
这个数的阶乘的结果非常大,long型的范围可能搞不定了,自然要用到数组了,开始没有什么思路,想了很久,于是看看别人的代码吧!和别人一起讨论下改如何处理,好友L给我发来了个源码,如下:
#include<stdio.h>
int mult(int num[],int len,int n)
{
long i,rem=0;
for(i=0;i<len;i++)
{
  rem=rem+num[i]*n;
  num[i]=rem%10;
  rem=rem/10;
}
if(rem>0)
{
  num[len]=rem%10;
  rem=rem/10;
  len++;
}
return len;
}
void main()
{
int num[10001],len=1,i;
num[0]=1;
for(i=2;i<=15;i++)
{
  len=mult(num,len,i);
}
for(i=len-1;i>=0;i--)
  printf("%d",num[i]);
printf("\n");
}
这个源程序在小于15!的范围内都是正确的,超过15用计算机发现,抛弃了一位数,

你仔细看源程序,会发现有一句代码是多余的,在14行:  rem=rem/10; 
可是为什么会有一句多余的代码了,我猜想可能是在复制源程序的时候丢掉了些部分,于是自己找问题的所在,发现在如下代码出有问题:
if(rem>0)
{
  num[len]=rem%10;
  rem=rem/10;  //显然这句是没有用的
len++;
}
这个当rem的结果为一位数的时候是不会有问题的,如果是两位数就会丢弃一位数,所以在超过14后的结果就都是错的了,找到了问题修改程序了,自然很高兴,可也有粗心的时候,我最初改成这样,如下:
if(rem>0)
  {
  while(rem%10){
  num[len++]=rem%10;
  rem=rem/10;
  }
  }
这样使得rem的值大于或等于两位数的时候,可以继续前移,但是在运行到27!的时候,结果就出现了错误,如图:

又出现了两位数被抛弃了,...什么原因了,肯定是代码的问题咯,回过头来继续找问题,细心的人可以发现被丢弃的两位数中有一位是零,这就是在循环的时候,while(rem%10)  的问题了,当rem%10的结果为零是,它就不在进位了,所以修改为:while(rem) 就好了,经过测试:

1977!=448855018614510872146108570799092488374244922604281667246541477296439717001054257200
848282187026008643491405531994254611952697561934491964205676706799979304977769628686
276708140885251373109313840534971076559531665877779781899225851020155432523138423838
793364524504054593658659309938823049675065793655731691144070614150449542045980428729
849943703629949741907316483658537640216412672088909521834869579377975014120793398760
170575938462195069211366837290821409798157388371819046282150259708797986894599754707
053997196238019436302650347176501400709485814555418603885995707129559037673403027967
722496783086672713343477351719207537227383826931699597558957779269222519341389464240
626515936266152215546681426803715337355455262459363936426398200767084591694107761824
817019824800509354291181565424290679207649154328510905787626750104781175630496560755
437461197397170698668448833574097925692091349606368994254051498470658312816020825180
758306464536545163179416963882770901668925811770703123383916534519553189062680794817
901942657518532191511443189303164539537509911484938232064433694259440019412429176195
273123112074174906937014940508088908788679758451178604333053166075514769659757909068
969561270682984332732402815299505300696418052184004032583043605273817463859608158542
391255658333115992105319025965792441496490082628856257475597282948149018719615178956
386229056189106009211274325234354820344316071715970932934998915398074696644195075073
858777638522407665776188642721759551020127971573740200572347904705738454426070862468
497588170924721686002336868050403078010189047469001368950074467678920151036915467589
178752831215596784240033519023752863559066762947219881282265093530848907397955914009
782924298230197205877688667785653929657561770327142604726525226381820421783104979133
632566668002116435869364802221690517368901190335756413622390970976689677071665462621
653983423920822238406699569355184324335005123881284005014545676560031406995263120232
155309694412496450002669817314747743117885666841030806526511302035795776599756219909
433017606562917696065816216978933817840952763085630966672047984245846077021116980652
547983768630767758389787959699754905696308094123461348505199673910262034358956551782
260185675564505471967802764559247028755848943704213825868067144545923241622915405572
895940932074883696162724580936468651536525916519778753937661580348466609945384704400
029567340587982623921420189209938186893775883681632120249801907323961237176548853453
183118812464523869797484923616088802153669595501541698899760988681774658119749971516
879564120352520913253272396638697185099940359509181644113613891825257354355035475088
390692794123446598619859205209060725871231233310952104913142361092408944031749511368
226897966825244192812025474107272070493001823136608827688994862996202505234295912735
836729490600013923247166453746327991214252078479946310572307940804963056399533044169
173622570388540138966025846683308785440235436130616257537361648607372249288776809526
539557965637925191623545418094738261656370518520505513757896739069910152317701913445
322372301972122478089777501673042113580015565869384459037102976554672541758684002232
510273166175949668193724532290900754163311699074767210793572793406582651325446166713
565237590708084025544095629988694661755545815957201866812913772380312299636024246927
245815629638715552997568462107195672489930902916430903408653729942477701756291231663
950930365909924014281630262426376312761189541377528506080586981886362490118985452426
049541742318163127972268125734275209431566534411169443563136171116494397824831163459
988653563712640217029343858305246075459160826817233363005257403519011997859289187566
671317593648569217133832109123280245596547048541027022591889688359125294998299821734
771425591225742380263687425897203020243519360929120629352071561607534226739507334110
876590196150536951755126848605617082306211594320597773342514611204705734756733589871
087148562951424389539665178774190122717498906533883333296445058400689676296731183386
465112180296589644318066308591855140929195086452647917686350437171769954069065649696
241394150567845029691926698454015469831197620502595328177088311295496580922932354783
202121472380610123425753689129962768898504679278005305910245052617381902926201965914
710579177719973146164688514356484472915097737685410169650063185827347732654256194131
439716967590068522672595618505254231154482450649579173089322487365908895532160533950
735286655568480235034742968721826531390850690885729951299702778479471078218606751453
646826509254209114121907218778180563722242223863342967739265063774265533033955432832
869792544790063857237216514737375817503664564110447784578161441713469133949863707094
740860239959995198091570666512884168738225635893231002341108383580550868975616742670
916011321141005586798343272643963376642190842477307335999959055280371369689195193020
021713183407449967747903954192812590579082669227350664522799568145166914342417682679
412338683529176867804652482735789999147867245254022311968129757071746050051531594305
282471258844125730417170233695509912897300661332255197828874835485371726957477440509
489609018440404583164677019382971644009401553738022678861878426364086549375040311842
467469563963773523753691301753243145894625280000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000
Press any key to continue

结果正确!

哈哈搞定!

附正确源码加注释:

#include<stdio.h>
int mult(int num[],int len,int n)
{
long i,rem=0;
for(i=0;i<len;i++)//此循环是计算
{
  rem=rem+num[i]*n;//从最低位依次取出每个数与n相乘,结果保留在rem中
  num[i]=rem%10;//rem%10,取余保存在对应的数组位置
  rem=rem/10;//取整用于再次循环,与n和下一个位置的乘积相加
}
if(rem>0)//rem大于0,则说明进位了,可以是很多位,如:232323
{
  while(rem){//次循环为解决最后部分(rem/10的部分如:rem/10=2343334)
  num[len++]=rem%10;//len刚好比i大1,则保存进位过来的最高位
  rem=rem/10;
  }
}
return len;//把长度返回
}
void main()
{
int num[10001],len=1,i;
num[0]=1;
for(i=2;i<=1977;i++)
{
  len=mult(num,len,i);
}
for(i=len-1;i>=0;i--)//最后返回的位置会多一位,所以减一位
  printf("%d",num[i]);//从最高位依次输出
printf("\n");
}
原创粉丝点击