#include <stdio.h> // ar+ar2=ar3 void add(const short*ar,const short*ar2,short*ar3,const int size); // ar-ar2=ar3 void sub(const short*ar,short*ar2,short*ar3,const int size); // ar*ar2=ar3 void mul(const short*ar,const short*ar2,short*ar3,int size); // ar/ar2=ar3...ar void div(short*ar,short*ar2,short*ar3,const int size); // printf(ar) void ar_print(short*ar,const int size); //配列を固定小数点型として画面表示する ar[size-1].ar[size-2]~ar[low] void dp_print(short*ar,const int size,const int low); void turn(short*ar,const int size); int cmp(const short*ar,const short*ar1,const int size); int cmp0(const short*ar,const int size); void r_shift(short*ar,const int size); void l_shift(short*ar,const int size); #define SIZE 10 int main(){ short ar[SIZE],ar2[SIZE],ar3[SIZE]; //ar=1000000000000000 ar[9]=0 ;ar[8]=0 ;ar[7]=10 ;ar[6]=0 ;ar[5]=0 ; ar[4]=0 ;ar[3]=0 ;ar[2]=0 ;ar[1]=0 ;ar[0]=0 ; //ar2=-1234 ar2[9]=0 ;ar2[8]=0 ;ar2[7]=0 ;ar2[6]=0 ;ar2[5]=0 ; ar2[4]=0 ;ar2[3]=0 ;ar2[2]=0 ;ar2[1]=-12;ar2[0]=-34; sub(ar,ar2,ar3,SIZE);//引き算 ar_print(ar,SIZE);printf("-");ar_print(ar2,SIZE);printf("=");ar_print(ar3,SIZE);printf("\n"); add(ar,ar2,ar3,SIZE);//足し算 ar_print(ar,SIZE);printf("+");ar_print(ar2,SIZE);printf("=");ar_print(ar3,SIZE);printf("\n"); mul(ar,ar2,ar3,SIZE);//かけ算 ar_print(ar,SIZE);printf("*");ar_print(ar2,SIZE);printf("=");ar_print(ar3,SIZE);printf("\n"); ar_print(ar,SIZE);printf("/");ar_print(ar2,SIZE);printf("="); div(ar,ar2,ar3,SIZE);//割り算 ar_print(ar3,SIZE);printf("...");ar_print(ar,SIZE);printf("\n"); return 0; } //ar+ar2=ar3 void add(const short*ar,const short*ar2,short*ar3,const int size){ int i,p_flag; for(i=0;i<size;i++){ ar3[i]=ar[i]+ar2[i]; } for(i=0;i<size;i++){ if(ar3[i]>99){ ar3[i]-=100; ar3[i+1]+=1; }else if(ar3[i]<-99){ ar3[i]-=-100; ar3[i+1]+=-1; } } p_flag=cmp0(ar3,size); if(p_flag==0) return; for(i=0;i<size;i++){ if(p_flag>0){ if(0>ar3[i]){ ar3[i+1]-=1; ar3[i]+=100; } }else{ if(0<ar3[i]){ ar3[i+1]-=-1; ar3[i]+=-100; } } } } //ar-ar2=ar3 void sub(const short*ar,short*ar2,short*ar3,const int size){ turn(ar2,size); add(ar,ar2,ar3,size); turn(ar2,size); } //ar*ar2=ar3 void mul(const short*ar,const short*ar2,short*ar3,int size){ int i,j,pos; for(i=0;i<size;i++){ ar3[i]=0; } for(i=0;i<size;i++){ if(ar2[i]){ for(j=0;j<size;j++){ ar3[j+i]+=ar[j]*ar2[i]; //3桁目を繰り上げる if(ar3[j+i]>99 || ar3[j+i]<-99){ pos=ar3[j+i]/100; ar3[j+i]-=(pos*100); ar3[j+1+i]+=pos; } } } } } // ar/ar2=ar3...ar // arが書き換えられて余りになる void div(short*ar,short*ar2,short*ar3,const int size){ int i,pos=0; int div_flag;//被除数の符号フラグ int met_flag;//法の符号フラグ for(i=0;i<size;i++){ ar3[i]=0; } div_flag=cmp0(ar,size); met_flag=cmp0(ar2,size); if(!div_flag || !met_flag) return;//法、被除数のどちらかが0であるため計算中止 if(-1==div_flag) turn(ar,size);//被除数が負数であるため正数にする if(-1==met_flag) turn(ar2,size);//法が負数であるため正数にする while(1){ if(cmp(ar,ar2,size)==1 && (ar2[size-1]/10)==0){ pos++; l_shift(ar2,size); }else break; } while(pos>=0){ if(cmp(ar,ar2,size)>=0){ sub(ar,ar2,ar,size); if(pos%2){ ar3[pos/2]+=10; }else{ ar3[pos/2]++; } }else{ if(pos) r_shift(ar2,size); pos--; } } if(-1==div_flag) turn(ar,size);//被除数の符号を戻す if(-1==met_flag) turn(ar2,size);//法の符号を戻す if(div_flag!=met_flag) turn(ar3,size);//被除数と法の符号が違うため、答えをマイナスにする } //画面表示 void ar_print(short*ar,const int size){ int i; int start_flag=0; int p_flag=cmp0(ar,size); if(p_flag==0){ printf("0"); return; } if(p_flag==-1){ printf("-"); turn(ar,size); } for(i=size-1;i>=0;i--){ if(ar[i] || start_flag){ if(!start_flag) printf("%d",ar[i]); else printf("%02d",ar[i]); start_flag=1; } } if(p_flag==-1) turn(ar,size); } //配列を固定小数点型として画面表示する ar[size-1].ar[size-2]~ar[low] void dp_print(short*ar,const int size,const int low){ int i,j=0,k=0; int p_flag=cmp0(ar,size); if(p_flag==0){ printf("0"); return; } if(p_flag==-1){ printf("-"); turn(ar,size); } printf("%d.",ar[size-1]); for(i=size-2;i>=low;i--){ if(j++%5==0) printf(" "); if(k++%25==0) printf("\n"); printf("%02d",ar[i]); } if(p_flag==-1) turn(ar,size); } //符号の反転 void turn(short*ar,const int size){ int i; for(i=0;i<size;i++){ ar[i]=-ar[i]; } } //ar<ar1 の場合は-1を返す //ar>ar1 の場合は+1を返す //ar==ar1 の場合は0を返す int cmp(const short*ar,const short*ar1,const int size){ int i; for(i=size-1;i>=0;i--){ if(ar[i]<ar1[i]) return -1; if(ar[i]>ar1[i]) return 1; } return 0; } //arがプラスの値をとる場合は+1を返す //arがマイナスの値をとる場合は-1を返す //arがゼロの値をとる場合は0を返す int cmp0(const short*ar,const int size){ int i; for(i=size-1;i>=0;i--){ if(ar[i]<0) return -1; if(ar[i]>0) return 1; } return 0; } //右1シフト void r_shift(short*ar,const int size){ int i,pos; ar[0]=ar[0]/10; for(i=1;i<size;i++){ pos=ar[i]; ar[i]=ar[i]/10; ar[i-1]+=((pos-(ar[i]*10))*10); } } //左1シフト void l_shift(short*ar,const int size){ int i,pos; for(i=size-1;i>=0;i--){ ar[i]=ar[i]*10; pos=ar[i]/100; ar[i]-=(pos*100); if(pos) ar[i+1]+=pos; } }
1000000000000000--1234=1000000000001234 1000000000000000+-1234=999999999998766 1000000000000000*-1234=-1234000000000000000 1000000000000000/-1234=-810372771474...1084
$ bc 1000000000000000-(-1234) 1000000000001234 1000000000000000+(-1234) 999999999998766 1000000000000000*(-1234) -1234000000000000000 1000000000000000/(-1234) -810372771474 1000000000000000%(-1234) 1084
#define SIZE 30 //計算結果がオーバーフローしない程度の大きさを用意する short ar[SIZE],ar2[SIZE],ar3[SIZE];//実行時にゼロ初期化される int main(){ int i,j; //ar=2 ar[0]=2; //ar2=1 ar2[0]=1; for(i=1;i<200;i++){ mul(ar,ar2,ar3,SIZE);//かけ算 printf("%d:",i); ar_print(ar3,SIZE); printf("\n"); for(j=0;j<SIZE;j++) ar2[j]=ar3[j];//配列のコピー } return 0; }
#define SIZE 30 //計算結果がオーバーフローしない程度の大きさを用意する short ar[SIZE],ar2[SIZE];//実行時にゼロ初期化される int main(){ int i,j; //ar=1 ar[0]=1; for(i=1;i<200;i++){ add(ar,ar,ar2,SIZE);//足し算 printf("%d:",i); ar_print(ar2,SIZE); printf("\n"); for(j=0;j<SIZE;j++) ar[j]=ar2[j];//配列のコピー } return 0; }
1:2 2:4 3:8 4:16 5:32 6:64 7:128 8:256 9:512 10:1024 11:2048 12:4096 13:8192 14:16384 15:32768 16:65536 17:131072 18:262144 19:524288 20:1048576 21:2097152 22:4194304 23:8388608 24:16777216 25:33554432 26:67108864 27:134217728 28:268435456 29:536870912 30:1073741824 31:2147483648 32:4294967296 33:8589934592 34:17179869184 35:34359738368 36:68719476736 37:137438953472 38:274877906944 39:549755813888 40:1099511627776 41:2199023255552 42:4398046511104 43:8796093022208 44:17592186044416 45:35184372088832 46:70368744177664 47:140737488355328 48:281474976710656 49:562949953421312 50:1125899906842624 51:2251799813685248 52:4503599627370496 53:9007199254740992 54:18014398509481984 55:36028797018963968 56:72057594037927936 57:144115188075855872 58:288230376151711744 59:576460752303423488 60:1152921504606846976 61:2305843009213693952 62:4611686018427387904 63:9223372036854775808 64:18446744073709551616 65:36893488147419103232 66:73786976294838206464 67:147573952589676412928 68:295147905179352825856 69:590295810358705651712 70:1180591620717411303424 71:2361183241434822606848 72:4722366482869645213696 73:9444732965739290427392 74:18889465931478580854784 75:37778931862957161709568 76:75557863725914323419136 77:151115727451828646838272 78:302231454903657293676544 79:604462909807314587353088 80:1208925819614629174706176 81:2417851639229258349412352 82:4835703278458516698824704 83:9671406556917033397649408 84:19342813113834066795298816 85:38685626227668133590597632 86:77371252455336267181195264 87:154742504910672534362390528 88:309485009821345068724781056 89:618970019642690137449562112 90:1237940039285380274899124224 91:2475880078570760549798248448 92:4951760157141521099596496896 93:9903520314283042199192993792 94:19807040628566084398385987584 95:39614081257132168796771975168 96:79228162514264337593543950336 97:158456325028528675187087900672 98:316912650057057350374175801344 99:633825300114114700748351602688 100:1267650600228229401496703205376 101:2535301200456458802993406410752 102:5070602400912917605986812821504 103:10141204801825835211973625643008 104:20282409603651670423947251286016 105:40564819207303340847894502572032 106:81129638414606681695789005144064 107:162259276829213363391578010288128 108:324518553658426726783156020576256 109:649037107316853453566312041152512 110:1298074214633706907132624082305024 111:2596148429267413814265248164610048 112:5192296858534827628530496329220096 113:10384593717069655257060992658440192 114:20769187434139310514121985316880384 115:41538374868278621028243970633760768 116:83076749736557242056487941267521536 117:166153499473114484112975882535043072 118:332306998946228968225951765070086144 119:664613997892457936451903530140172288 120:1329227995784915872903807060280344576 121:2658455991569831745807614120560689152 122:5316911983139663491615228241121378304 123:10633823966279326983230456482242756608 124:21267647932558653966460912964485513216 125:42535295865117307932921825928971026432 126:85070591730234615865843651857942052864 127:170141183460469231731687303715884105728 128:340282366920938463463374607431768211456 129:680564733841876926926749214863536422912 130:1361129467683753853853498429727072845824 131:2722258935367507707706996859454145691648 132:5444517870735015415413993718908291383296 133:10889035741470030830827987437816582766592 134:21778071482940061661655974875633165533184 135:43556142965880123323311949751266331066368 136:87112285931760246646623899502532662132736 137:174224571863520493293247799005065324265472 138:348449143727040986586495598010130648530944 139:696898287454081973172991196020261297061888 140:1393796574908163946345982392040522594123776 141:2787593149816327892691964784081045188247552 142:5575186299632655785383929568162090376495104 143:11150372599265311570767859136324180752990208 144:22300745198530623141535718272648361505980416 145:44601490397061246283071436545296723011960832 146:89202980794122492566142873090593446023921664 147:178405961588244985132285746181186892047843328 148:356811923176489970264571492362373784095686656 149:713623846352979940529142984724747568191373312 150:1427247692705959881058285969449495136382746624 151:2854495385411919762116571938898990272765493248 152:5708990770823839524233143877797980545530986496 153:11417981541647679048466287755595961091061972992 154:22835963083295358096932575511191922182123945984 155:45671926166590716193865151022383844364247891968 156:91343852333181432387730302044767688728495783936 157:182687704666362864775460604089535377456991567872 158:365375409332725729550921208179070754913983135744 159:730750818665451459101842416358141509827966271488 160:1461501637330902918203684832716283019655932542976 161:2923003274661805836407369665432566039311865085952 162:5846006549323611672814739330865132078623730171904 163:11692013098647223345629478661730264157247460343808 164:23384026197294446691258957323460528314494920687616 165:46768052394588893382517914646921056628989841375232 166:93536104789177786765035829293842113257979682750464 167:187072209578355573530071658587684226515959365500928 168:374144419156711147060143317175368453031918731001856 169:748288838313422294120286634350736906063837462003712 170:1496577676626844588240573268701473812127674924007424 171:2993155353253689176481146537402947624255349848014848 172:5986310706507378352962293074805895248510699696029696 173:11972621413014756705924586149611790497021399392059392 174:23945242826029513411849172299223580994042798784118784 175:47890485652059026823698344598447161988085597568237568 176:95780971304118053647396689196894323976171195136475136 177:191561942608236107294793378393788647952342390272950272 178:383123885216472214589586756787577295904684780545900544 179:766247770432944429179173513575154591809369561091801088 180:1532495540865888858358347027150309183618739122183602176 181:3064991081731777716716694054300618367237478244367204352 182:6129982163463555433433388108601236734474956488734408704 183:12259964326927110866866776217202473468949912977468817408 184:24519928653854221733733552434404946937899825954937634816 185:49039857307708443467467104868809893875799651909875269632 186:98079714615416886934934209737619787751599303819750539264 187:196159429230833773869868419475239575503198607639501078528 188:392318858461667547739736838950479151006397215279002157056 189:784637716923335095479473677900958302012794430558004314112 190:1569275433846670190958947355801916604025588861116008628224 191:3138550867693340381917894711603833208051177722232017256448 192:6277101735386680763835789423207666416102355444464034512896 193:12554203470773361527671578846415332832204710888928069025792 194:25108406941546723055343157692830665664409421777856138051584 195:50216813883093446110686315385661331328818843555712276103168 196:100433627766186892221372630771322662657637687111424552206336 197:200867255532373784442745261542645325315275374222849104412672 198:401734511064747568885490523085290650630550748445698208825344 199:803469022129495137770981046170581301261101496891396417650688