当前位置: 代码迷 >> C语言 >> 请求一个巨阶算法(1000000!)
  详细解决方案

请求一个巨阶算法(1000000!)

热度:180   发布时间:2004-12-09 11:23:00.0
请求一个巨阶算法(1000000!)

请求一个巨阶算法:1000000!

请说明解答过程及原理!谢谢!

搜索更多相关的解决方案: 算法  请求  

----------------解决方案--------------------------------------------------------

#include <iostream.h> #include <iomanip.h> #include<math.h> #include<stdlib.h>

int get();//输入n int getBitNum(int n);//得到结果有多少位 char* init(int size);//动态分配空间 void calc(char* a,int n);//计算结果 void display(char *a,int size);//显示结果

void main() { int n=get(); int size=getBitNum(n); char *pa=init(size); calc(pa,n); display(pa,size); delete[]pa; }

int get() { int n; cout<<"请输入n:"; cin>>n; while(n<0) { cout<<"请重新输入n:"; cin>>n; } if(n==0) exit(1); return n;

}

int getBitNum(int n) { double m=1.0; for (int i=1;i<=n;i++) m+=log10(i); return (int)m; }

char* init(int size) { char *pa=new char[size]; if(!pa) { cout<<"分配空间失败"<<endl; exit(1); } pa[0]=1; for(int i=1;i<=size;i++) pa[i]=0; return pa; }

void calc(char* a,int n) { int begin=0; // int sum=0; double bitcount=1; for(int i=2;i<=n;i++) { long jin=0; bitcount+=log10(i); if(a[begin]==0) begin++; for(int l=begin;l<int(bitcount);l++) { jin+=i*a[l]; a[l]=char(jin%10); jin=jin/10; } } }

void display(char *a,int size) { int bit=0; for(int j=size-1;j>=0;j--) {if(bit%50==0) cout<<endl<<"第"<<setw(3)<<(bit/50+1)<<"个50位:"; cout<<(int)a[j]; bit++; } cout<<endl; } 原来写的,自己慢慢看吧,可能还要稍作修改,主要是数据类型。


----------------解决方案--------------------------------------------------------

谢谢啊。老兄!


----------------解决方案--------------------------------------------------------
人家用的是女生头像,怎么叫人家“老兄”!!!
----------------解决方案--------------------------------------------------------
void main() { int n=get(); int size=getBitNum(n); char *pa=init(size); calc(pa,n); display(pa,size); delete[]pa; // 这句好象要去掉, } 否则运行程序结束提示: DAMAGE: after normal block (#48) at 0x00440040. (Press Retry to debug the application) 终止(A)   重试(R)  忽略(I

[此贴子已经被作者于2005-2-24 15:56:15编辑过]


----------------解决方案--------------------------------------------------------
1000000!的位数应该有(1+1000000)*1000000/2 &gt; 2^32吧?
465G个数字,大概这个内存是分配不出来的了吧...果然是巨阶-___-|||
----------------解决方案--------------------------------------------------------
@idealistic33 你遇到的错误我也遇到过,应该是分配的空间在使用过程中有越界。不应该去掉delete,那样更加不对。
----------------解决方案--------------------------------------------------------
计算:3000! #define STRMAX 2000 /* N 越大 数组越大 , */ #define P 100000 /* N 越大,P越小 */ #define N 3000 /* N */ void main() { long t[STRMAX]={0},a,b,c,g=0,x,e,p=P; t[STRMAX-1]=1; for (e=1;e<=N;e++)for(x=STRMAX-1;x>=0;c=t[x],c*=e,a=c/p,b=c%p,t[x]=b+g,g=a,x--); while(t[++x]==0); printf("%ld",t[x]); while(++x<STRMAX)printf("%.5ld",t[x]); getch(); } 运行结果: 4149359603437854085556867093086612170951119194931809917689467657697558565123531941008591007652178003420075184635383617118495750871114045907794553402161068339611621037904199177522062663390179682805164719697495968842457728766097103003726111095340241127118833157738815328438929737613021106312930374401485378725446079610290429491049793888120762511625132917004641668962117590203575175488980653577868915285093782469994674699190832093511068363824287063522268544339213775150488588104036818809099292912497141900508938994404715351473154531587441509960174267875087460367974117072368747277143988920683691618503608198459718093784453523958505377611086511162363145920886108557450874513945305436213711898150847192094426374203275029996333784944014775671414680824207499914714878359669720638954670589951017856948026338876711287106800495082740071712481947638640136919354435412031278651014347925499591435301206531034066255032310207383515021951031486736123387393950965514621593490157899499440723110044269248381401414554878727380458560235615832043179459530558306933512468907212461514684853087240312679670891135489827334753757568993651763964247817334625108790157434373989204922670983170339321071763439833524445760404765654004144146994799843545545977993867028394285134131889131656953108485135250940061477740470073314065417944280044366919036854692708572717016471011512057452448607968773784803660653009109815639091294110633715621540903800135058671624262333902434166628716521228590274568833504897926869369792878376894841436573866436955075473964882256222183380014600761196859217603234808467455216330411738004331144225926243690558782914907973885758784585739828695390302383837265882427654306437517757897215045071361801730051628424476294227485755627828763498767195281368913583918824499284741591683130334032199946752082914885764345863832313545205075955912062067273296951386122994658607527317884452449865348164169238844889061495850934373442889814884427321817131272533891534506581143823381205875379808605080889761753882896252933633750454549168600267229591225528854584482686655324313011353754812409561237686078007700707939541848907149467377854407528307872988103912945121929864793703451257436445581459757140822705986325165352906584571123585270211933452981105568398809884094980346185078025273038736784042169427237980464304241004503080663703276001634192144280570880243085056789210864697745513953911983863616719030027814638013693248233277159518059619306950423783608262057088720929792979742940457687733831987744468554429480032174105668942371054502887041961191507273899100316420144742133232938716180295556140046028674004228853898546503280284285151222960287957418016218232360983209714410470125330673148961532367887349845539496043970503523477662113959145192704221222314269986920874635209806862243548133761943951319428681134865315622281732149764817053818461553265961875302964786011608722636404439222576019264946109168851510131439455743983031925571541621514424691223705191490978618494361509631099336395945617965933968519586053386311763241470668422571923947425317264795597499932832472798078964707530540141940902006097126747531863655254032127577578539306975300565952082074574994718981444537722482078884433351185456015688537081828928952183001396543769472864187766657628153897373401594105436814354373461342446920670700827824236455574508825566701572427528103171416406314106813843309240272813189608848130406652261695528256371838624649442956888593938467267236941994755713205451018263425731029115353532728808182773021596787088437293412117084511580629967697266601663635276959969021502122104954259567278593185516268447100374434620422003535391203738393095420695021486207390653190910821344334251497896284236198571674773848126097443055036250866354720730971298084697196537722779893160200560725058007512407494448163392214398118492748281978655178478547749198714138485042290383954090570842038137277135667703565041081780520695032136233521692740531015340921761834078817735674646749071616600653230438902639786065508100530987243544568931560132994240711229501545377152105194244551279536497121487222219372928915983300174239797759253050131883788349488423222250731881639943893562781710287543258879455885774278039071716638125790379814914844552688587162993101451073321555477326457603591618429870832323756883791713507300602673829229468708103075194602037643813867710733377931258225735643553457716280403048092578590974723341393290407223986000544826929611039364012753953989939742002192526892862256495927913636954698324731449409429749421320871696366281296384619137811460921070103301211993426494166644913031089849353536640183128268311250657838642590653719701090727642933053475129733671692941504787094924177812153497949944973235844513021002972035999357650773056369695053999089125200480101200905696331443681791942479635633891024862507733672493998017234516270488501494383437358264400534814749574213288736484795895538438363782756014333777988161268544624064941344161191089526533267616276602211308792116659243794965348380302360642949819855410143115666017395185394260086731985645866846354427301800222926075897671921983675295283651587155218876983179990058531215186910377766768836542912474198260994345356715294128238376121155556862104545838103551544049537184707263632185327754864101811002621331228429860926112159573066023932077476742800909462674322138805290643067711276964013735906251051050623568241317651533030775358975134565147424167401517470720839101869989993279364910892687924739705814152855543965954222603919059265825637344676406359525838966981511983959886603683753042017990328185945569412550519066302854869533377682984510003180809382213003810221438705746118130425196191640597045603518312170815165864735655654053292841174862895708285679230005352584637706128059145203554638993212787590634962783797587135258861821325226357703839620273738532490835368049799008570152248330343952519734465334299465256523609674283455052373973390237426180887179928372228536629343924089576291315444210657360920548184213936589386771554284247727510016673435774309363894844456476437718407387437947100786715107044955465762628156613755073076376808060003184429623397780823331135978757713698301281757162567168328728151193733668578943710909774858122286812682412231727268118497520786345310749533170826015315944025364536552445358795203474521342924891664450480435535228197772198197186905488417689639878270478206612692147254861824785962643427919027450345299476936799721728516546559179947178906788568727857447008428972377823476308074091951296623834642783965386501732466585019214409169463037126558119770077468256203519831878291359101399781730363517376470671438399281029122446084832051898324834885513102553972158318493165367073227317299543175077547563474812732095665543185187958697817249172170086576809890832783083824043773797445534252568871289885551318096701249785945429060962737059065997078417273842072160557678906056516769456549012038816577586193923092436298338954985727987452339809049985846748485039950910939883421042469311361787597861180309610877436276499041465516754550761366572591499337611434024376291029038413588853131259113254484922589600718485116939019398543464941548378233830253136877599000544372233290146256818409599883052252158532859983399033659541893269668016326589935823466324708032402042979135742575549854937289619209165079467199712143983258155394583512564801088988688705688271122262873403577241842480323117302733844222060401560924207956949320494380940246556253030332882416530203800604128844438488418912939398597176567021150161134012116935553586498480294156323827944757631504268573426986311656271009321645781654104118990783962107586051450915265284224336472308804690884264125251265847291340591951717542911526220022297569869279591246209643630570521330992164222584376518891936303298512232829508061262005735655542131835558382893181387959409623037927772303444234323415616035585905023244752745026308698314141253963717544136118972691586507167223080834352955784010872360273470011187861462331854394310570584837704748060350045568850206027302222563976307389399850249781551826799169941641455403299098131905066543581566576915290689081862041384440914563552912420648101717436430473455191375922914953282988151808740076733486997695322871450791584448703980405737673555777873593937891577147956023340708456392314170118392555234618119775915673385955919265270624063734277760215846511035368057963320714896942663358570375305829676608224208465464558556667889222627619990263961792637457851652540918756608543859661221944248720424960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
----------------解决方案--------------------------------------------------------
hehe,楼上的,不要将本人的劣作到处张贴,我要告你侵权的啊
----------------解决方案--------------------------------------------------------
以下是引用knocker在2005-2-25 10:35:47的发言: hehe,楼上的,不要将本人的劣作到处张贴,我要告你侵权的啊
帮你做广告呀!
----------------解决方案--------------------------------------------------------