fork download
  1. // 162_646.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. #define XX (2)
  8. //#define YY (57885161)
  9. #define YY (57885)
  10.  
  11. //---------------------------------------------------------------------------
  12. // データ
  13. //---------------------------------------------------------------------------
  14. #define KETA (10000)
  15. typedef struct _T_DATA {
  16. int *data; // 10進数下KETA桁の配列。123456はdata[1]=12;data[0]=3456と格納される
  17. int d_n; // 有効配列数。上記例の場合、d_n=2;
  18. int d_a; // メモリ確保数(int配列個数)
  19. } T_DATA;
  20.  
  21. //---------------------------------------------------------------------------
  22. // 関数
  23. //---------------------------------------------------------------------------
  24. void T_DATA__Dec(T_DATA * dt);
  25. void T_DATA__Delete(T_DATA * dt);
  26. void T_DATA__Init(T_DATA * dt);
  27. void T_DATA__Mult(T_DATA * dst, T_DATA * src, T_DATA * kt);
  28. void T_DATA__Show(T_DATA * dt);
  29. void T_DATA__SetInt(T_DATA * dt, int n);
  30.  
  31. //---------------------------------------------------------------------------
  32. // main
  33. //---------------------------------------------------------------------------
  34. int main()
  35. {
  36. T_DATA ans, tmp;
  37. T_DATA kt; // 計算temp
  38. int y;
  39.  
  40. T_DATA__Init(&ans);
  41. T_DATA__Init(&tmp);
  42. T_DATA__Init(&kt);
  43.  
  44. T_DATA__SetInt(&ans, 1);
  45. T_DATA__SetInt(&tmp, XX);
  46. T_DATA__SetInt(&kt, 0);
  47.  
  48. for (y = YY; y; y >>= 1) {
  49. fprintf(stderr, "現在の乗数. 0x%X\n", (unsigned int) y);
  50. if (y & 1) {
  51. T_DATA__Mult(&ans, &tmp, &kt);
  52. }
  53. T_DATA__Mult(&tmp, &tmp, &kt);
  54. }
  55. T_DATA__Dec(&ans);
  56. T_DATA__Show(&ans);
  57.  
  58. T_DATA__Delete(&kt);
  59. T_DATA__Delete(&ans);
  60. T_DATA__Delete(&tmp);
  61.  
  62. return 0;
  63. }
  64.  
  65. //---------------------------------------------------------------------------
  66. // 操作
  67. //---------------------------------------------------------------------------
  68.  
  69. // 初期化
  70. void T_DATA__Init(T_DATA * dt)
  71. {
  72. // 最初に必要分確保してしまう
  73. dt->d_a = ((double) YY * log10((double) XX) + 1.0) / 2.0 + 1;
  74. dt->data = (int *) malloc(sizeof(int) * dt->d_a);
  75. if (dt->data == NULL) {
  76. fprintf(stderr, "メモリ確保エラー\n");
  77. exit(1);
  78. }
  79. dt->d_n = 0;
  80. }
  81.  
  82. // 削除
  83. void T_DATA__Delete(T_DATA * dt)
  84. {
  85. if (dt->data) {
  86. free(dt->data);
  87. dt->data = NULL;
  88. }
  89. dt->d_n = dt->d_a = 0;
  90. }
  91.  
  92. // 値をセット (n >= 0 であること)
  93. void T_DATA__SetInt(T_DATA * dt, int n)
  94. {
  95. memset(dt->data, 0x00, sizeof(int) * dt->d_a);
  96. dt->d_n = 0;
  97. while (1) {
  98. dt->data[dt->d_n++] = n % KETA;
  99. n /= KETA;
  100. if (n == 0) {
  101. break;
  102. }
  103. }
  104. }
  105.  
  106. // -1する (dt->data > "1" であること)
  107. void T_DATA__Dec(T_DATA * dt)
  108. {
  109. int i;
  110. dt->data[0]--;
  111. for (i = 1; i < dt->d_n; i++) {
  112. if (dt->data[i - 1] < 0) {
  113. dt->data[i - 1] += KETA;
  114. dt->data[i]--;
  115. if (dt->data[i] == 0) {
  116. dt->d_n--;
  117. }
  118. } else {
  119. break;
  120. }
  121. }
  122. }
  123.  
  124. // 掛け算
  125. // dst = dst * src
  126. // kt : 結果temp
  127. void T_DATA__Mult(T_DATA * dst, T_DATA * src, T_DATA * kt)
  128. {
  129. int i, j;
  130. T_DATA sw;
  131.  
  132. T_DATA__SetInt(kt, 0);
  133. for (j = 0; j < src->d_n; j++) {
  134. for (i = 0; i < dst->d_n; i++) {
  135. kt->data[j + i] += src->data[j] * dst->data[i];
  136. }
  137. // 整形
  138. for (i = 0; i < kt->d_a - 1; i++) {
  139. if (kt->data[i] >= KETA) {
  140. kt->data[i + 1] += kt->data[i] / KETA;
  141. kt->data[i] %= KETA;
  142. }
  143. }
  144. }
  145. for (i = kt->d_a - 1; i > 0; --i) {
  146. if (kt->data[i]) {
  147. break;
  148. }
  149. }
  150. kt->d_n = i + 1;
  151.  
  152. sw = *kt;
  153. *kt = *dst;
  154. *dst = sw;
  155. }
  156.  
  157. // 標準出力
  158. void T_DATA__Show(T_DATA * dt)
  159. {
  160. int i;
  161. for (i = dt->d_n - 1; i >= 0; --i) {
  162. if (i == dt->d_n - 1) {
  163. printf("%d", dt->data[i]);
  164. } else {
  165. printf("%04d", dt->data[i]);
  166. }
  167. }
  168. printf("\n");
  169. }
  170.  
  171. // End of 162_646.c
  172.  
Success #stdin #stdout 0.25s 1964KB
stdin
Standard input is empty
stdout
13222056527752026322249890652327043762772237179287803170485056775492417469041260467734979635520270352001433695180468275809582675027400501357517798847972489193161104011776154954281998125799601939591322210392122474941197877798304399041468574692699101902035739115647052079703356203865840574897088404638621954755702740015063711788594163627697523860247166390682598577834845908261852659433792527660919900819285960091478104501210707535059692603262722318928207820952621288981725143253677623944878910701110284517963379855661406455653009580408413514223576485648238394446445263067080113712111303093872709349500004416112261013336308636020912038510883579212371001715870781777166613257734026473509036976765138075503477519475481592203443651234513764962607176296745875702629576565243087879213606835912910831232397501872144640282683211354117334313579103817148975111191665187687323960094460182544532095422043494867237586447077623445937928355033791354533563233354260779078397932557425083378172907274468765544209551098324077866667390868747542652057805949459508024756157109170958607623058168415397397003259052089152289856561481438334131751744811167581490694312687187514154128248348195717687921258146470967200734896530339575784883476007329375350838649114935736827956742571524279947997516375626775879506016862828716389694689753676214924711007911164589171739065840324426706687214868917566879947936825875558979105971112484432522299767883031945634242649129618975299907334757565550322621256723493407965696951290738653682132475738920656816052249513030360830067356636446656627079215618114461623001655203267974929468890886868722952367074369312476623071818804164223232076049805699737936055356302143668497891860338942412359537288089632284608227041133074723645741675369383911059007900542749025705032015950867756188801716934315123653952283370876630099734721784169080475077975161026969796686561740029540090674655308746918626566519565127347212024675538012929838572917151101832906282915208818634117375087335808136673423452930006903682746059032366825402901484819625477120586540181229235761145734017116551330168633885999798242362154316042869339708457467216683986887657940100262878449078729722978981011351043339297169077695139969622703941104907707933745769973343405769422513201509043322526407978678039842762695747632876938650286402260992307111999920131575248167436174373476492609731087697089890550591190738075047858401082265522446101580996107824958365814949514618151114258188942548261071531894628449956631357491928104959222123275070879586603878740098085047698953386047245325009212888232824852499662502225812905489732737216472302281067366965768324344927468497491659468863711859233167421542554028124925982928091248187995699378400312453884720201811091929357165752587885176352380185428144587490909911250997808289413619478289208605860141094604499621893355142054311164171775683988475040011361046115666027981619103539297078367943758834126988937196021121904781993711066861206617584691408631599019427775805608675941967860408838232431888600758256100833780297315493630507039647917655948923498849681371735428406588707774368457414360916645372217628092732132296874639492711184792894580782957379490988501108550455144005905751498959591656258108232500274157802603115884187190791953057630115803423767801841700207657931625859143708213984230142317406970641666175352157226828820588085544715787953494354128473069985082383654568516553741718082275815787310014421248344069730035511561664374865864812663320163524332997930621736195322654182841258560246288107326700338155872059306332860789101566861591020001633182728061641374546038732690673421396571383950633078744303332269800203321289813141727058740357221548703443373265168978762942731810142278803057593779696588329480326594887645194789799380182352762051121415106989815815350844451163838054906633254347676085751836189486053063850823324673989271848071556772397652747029100818651244865867896092555422123964372223789067393221348083006526257420453445503176975704943572158947472180214218257885786063973855809856618035854685961921850078076292766665211963631964561146826898105217627476600829814062121545816225057105004213281864212950486220829102916335829039789594540499752524716791040645358827891251715460333012751834920057506144413249005510636720877821159354093377190101142893968481895425697017529209639416896805731278133077059289361349369758287227159154172428693284196220802153574860356233157942535466110689661819521978349740965036955552062591203565425853163384910927034961787396633748473310705161166200582211041039824006555909412086524657739323057883745127676873937049005474146998992786821376425010488299052804879306415179706211468233532010730246202129444362180510084035854430709573412121406829247965062333119710235125195134487368892524403194611084678253006465008420426948289695034169794843194040077031277890537554901705123771320513213837533545509305545353983209527501839587367660276576518335909747346846486695712350760080962645837036914586857234307639337647546792297363756589397670197870735937508605137915844087212286845358820175021038155826605444966261812309434748511554960826274623822438177763776790771235934209504026654589313609381350541964189079640007768012467108400119657341590576764451049760105939793000194942188707217854012374779738131024497306418125745484491330439636259473133529451465670763843449688176032373283307556022127920979206332045863531680192983290381971367339921514792294673033498599384752241681109695046102010977033565232243742583743091119015785317169684713334118991929432030594844632634128349960491790793549932358863061643029500511190026877656284265457802243210590567383392940881878266309693545278960195930587468112059075023253305406162412189613885779841240262461012826635531564255162351502348013784762200673953465141651745047379823385645196970208217120452310414445238243248644292073100495776084129789270305844471078780441045452075773453375228618112286358448133220677050216861611576322999239894327655173147727040737397831740210016817715561429601976295096004296275202704446990481373385800232224757204924246716036485374186538554079582763367576268541704782969360873913768913926325778118504115591862053797843195630049049371826040983496275286145880915134365401828182395453565375980735629455246159402800220776304877096152800749304838298450870336953039440530277788002588302599713813059352453555702829932453211849295188626520680397324030136527278930267844772459372500838552102446383725896621656823625709828673316270715754344924837472678760884670785719818391365701968706422165388954111519976287885076688445513131024392118649030824662811530093816308110950940631907879748583020768561153871947858473587651227481789355309307221053732619747353153194733259888182124901621585778218524864393434199538162286047863237233045946998021103723558830548088852008976461366572652373633077407997948057552512969998546296118003507644730826104018002682731042215904397528745921359996152412786162567683025655259898244227749438909425621517688491734885719153104423233404897045869134569253195618633240152371836689406693054108974296497683243903393472455932773277903408821761086136554979225347680779101881137510667547575700362635665651192725012643627682974519563422903292274482331910846174410075358425030678966711302117585337035999963343879601200662479945869241621602092434692414186621444427780333881375601118969881407903181782036762210256684380600337547021402577563709012737304865852793873046375537775585425404786496826205226377312328863105650879473681563477706151041513817142560357231228434936041529159154523660129547367057251606376728709031801955151193941718161139174370107425264072141568830926523337653736913350246068565246068610602504295673599903051306679786041713215983829813591503266769661019732349259933586867059795643302979738703609249101189403246428320564880858511289708946111515455368841797160684696471369115244237709157869101814159420462418969906217541569263916905167881505164980763939593861652615839333382958896076073349716474620822414725628490607282539876491956788876548157488002161008916060801504457209539348136320979388640467994109902830469725786502678250259681525108714183827877294869862312885787792202648566071231610464311330292041755621096239786215325428629111706127451970215106746962587523880074009873681012768357412166629533037992440364565894615186899881880542611983017081158817968117371907834716571022930084938905216479526017518917112997891016015678687088566543934134768962684017227718810464136197838341129821676851182491717105169792714323307336580259631071667180211240661339985493573454249470797485886429992777459034297307563596763476553676619627445762138205739323400486136709779119311017967449489084263741359989195560353309431162656347732150918377405996426008621929137085186669550273410698446456759935565887599454643022531540210711739822304202263754455280119475140843095176732878309372531270857843032691401433896862356197781239123203065754564147543064648704426013357806354268743912307018435330441750354061279337957242413753763709371898787296394871995520156409600585040429906295451083238145194263915723622823068658546000033897505957822297246846931194725391010238944103172291699989723703030172920766163623079321038519973294532395205346202486636438035829902165563484414060832960905466639591340662229509852774709058090841040561493781445364845778908926137839491749368140693849706124824458831884103373066426030573071108444953101112337005353342710622966599435139737980686806197903468487753221566790667724955682290639667227315809497511764872256786786360221258336387520946746461689321027294384608319705714276976576503376773839646658760868254460548044382573951542322789839663743616158106862053888403187276774016814344487443782133726865448681398553111368108693242584602416051046282025508244450610162297516846489738440801716502341653707799445085306328545930278060393549016606276037122687491448070149732294207267859948205325507312145802828368380165695690644408119619282372313064966283335951013998022215502157798174446675116169630334304009941523827942570979148046146616735275531139953403286736068381718351339952902581514352570715333867892656900083251482253720837349531569001581297429523732402851008284945259669165847604303493562724787843879595585702520332818682407335498365937567986268406566784084538479592265754831684701678101767852450479134919603015692807785413338055515611798064093080738510884591473087859426481851603340690874024971830937041280783875264872085415569267433506414676791433296561285663409647114269102526630598256582611953347821344162186070576135935688631154770847690958259843427782443165202012389251372377923335852331719963797469773009521775475194667141655918871459298794067502610984090100568341986781821633112463581313401281239573693233590156469252482118735509149130339537464965476661560628005180050178838996908288308794657112378149564747352163858980631771474716425793335338219755433113920496978752101378619207971601709577084244548573026261179223214881436949428214867592055420793952224322616528785152685857709376486978201195173807315639412628458428388266444232390485299947174437350493333571178196951034485852456868164620134632267934260236454154892636836072875477072872377937342957742322853012040684539111961683158580403966543697347259749391550647206577601632718568209198722981519175874462338339504033057517879973549414626391229162585049279943668525877051808575834896048038604350454865533376313556812489095887794547368917557149133685238931358865971548302149805827615199359339957664283734902397662491265335492923895169702164244684704366645924079357189506873993254583141552802267868394662004873950146192955568180423371067237275157558883061969922140316093151293196166559041597764055710482991624989185112116954122464752368906469031171046096264815241282561205627435669828250116640216973830942152696233915286090943031706204701136303547951321948118858351374991531571388736725046393225543288439529469401368107415115035268253328743651615546932845879000871093548634945873483981146830201377607072577655704389812301942171662942030224881115472298521863814997416921361669536721660908193261732492912875647668516838978076318036826180476165629240911034344654605825853450923648053003755001688927861989285116163442758155518824994183186710510036320129109045642176990208928298606223124500495929776974492403018064198224827940366698393014690084616521834783742479156557313987664938093317690245847042773835518923588629949685295371765388044042420475430170720320162581213130557033351516545084056055202549073476476117571697072982950664905687069339383271625698645260038541532614728870627680243059283980606240658904902059186816388148070001960908949077141599846690987313320877248720892737200393057274432387116473597072468901133687890576066431684936557694008293134845353797676247548602907619691009385121484758026589074292127727282757016581302313376615451748999389409545658753174000332533313631727610521538565146341043776852521932257541442330207401778930064313146562914071853824406013096521618700553413724704430775461342823682586779483771711210906636052312337686415166542412813778489323009640472445893246451955656579423960978262949909329556688355206298044957952033464643023175520626173726610569922269911939985015475813958368632847048286698040879573187280925259671163415991030688579792002236203181106021063192977807927146850687568370380587479106806923704598815982138229603530344315709126916399647524832146503058332709641662013296047042005385412485981211400528264631394035792464924576113717053472910140516539745284723811042984374609960714181401186412107945900039720240835046648946788598858647493919330611057229980815235544973832908312051267170508459073071172398568767879107927489559718499908178008136401234520558819750626053156124361972906173397979883730625546776168399878417852515314503741502105745551665098504448771031249434895820765010861156177523520101785217436683143582520208241759735795967976425332061206816235980009254225076000275931050070098771180940159201104681399349937739066931347264302456184452146889754652090958917986622694158412117893166544932118541547479087939053050418150556689247591765537886020351348342203629861631691468349263854792009003425700174340526590340267721825459594386518685091960926898653247453332693422445066315981091380806589636079568405653052784176717338172194935286119538608651029475026080015913011203707983396932891462012314410945773069240400398472283001144030822458439328557748080220500011919401462884234870718744046941352205458682326084911460889993762365415131084921775728465385816980792926000036405116967434439203085230221335414390339210924691206929143155998484402972522527715145131828738744044469922611906848326369112865212537757323726922321822451717419624871472184739512866135896405122333136587536494515665245618172041695217440161572167120238927752841408287577203016314093962726572130192075924754259824750729000749113978734619813180368021556200063077874803411002585144969353324133790280099532590258154651425344605186720733604410675804097028423850291558586130502076805873632664065035190751611222559833507001782197669543733089870835447051048527263346695717054533509795705901216011669054452167013490842901162510918249470032383811998562170781022937248606628517571435921076456156273904527373240983690871824349025874381637734762719053819364402825722778076562293762656450196928259744121941651321037407387032661075092459902393039283609061258323042501034413237679094508162114784253261527033522013453878376143162243914266545413864230407476914399406590331408419573459369441201041320614238144310194674686094841027628699389948733412133733533546918144128307479528868624359109581120104435700237646115778057572195710907586060541632580246475564946536828345169044971300894165290814437459636185790218350764234255144379832785024348766538435076751023384673822852952143017970681287300680761111784209977425745598662997617427612207521682602076561200537801507543837971479057741602361211731672788676945016260307212941296501580222528860777421016427373896054117207689414023698970432311823087738000192217994776409316093904780169007255858315448426078294292092851573083532164332659656736667856355851128335102784994629358628505344763362784494848085327940333135444183302519197270515556065654507137879366541335712675024860805369658645413191064830812680419762342338282283432879651638338656395368402649450804349253219281735763239834461474137826421659196577243068152867884990999158940239286909507317064692638701802586152521712062595613945279636730184032060372908314841772534300697593303898694929910101373772738707787450531879474915999385127402681421708129713921529542417371409553660871495967129884944870111958157326590887083451441274291418906301961351006704829158960299048399249063709790373767225779466822330403701319121930838002068300380656705537852420798564436813368676019845100505785991369347663423615866531154162052166892538972037641531872044308424793732066864379587158172095931868141361423625798772443122290990820209351458134631665089824236838543181062488515581452374261312900415793613910336870999815812354217703721336509749584932042110216284557826072831283756909970610850118393065863005085456801995668452482460755327493031203328142465545369679207064332851872799179623100834353925038277297766981705798087418521019639478908030389947588919855546784532696190066249871922672345120255384381181144570049536732398033369224066553027042067063846175300856043919188793990036878979038046648343925361318060230662284429351125870789222707223309805540383172139479299275240375393973817535846745468303234418817139194531220591154706775614843776262986162785779680438516151304395667013631