2013-BIT程式設計 7. 四則運算之加減法 -- 高精度加減
阿新 • • 發佈:2019-01-05
void plus(char *a, char *b, char *c) { int al,bl,len; int d[1000],e[1000],f[1000];//用了三個陣列去做,覺得很麻煩,又沒想到簡便的方法。 memset(d,0,sizeof(d)); memset(e,0,sizeof(e)); memset(f,0,sizeof(f)); char tmpa[1000] = {NULL},tmpb[1000] = {NULL}; int tmp = 0; int ff = 1;//前導零的消去 for (int i = 0; a[i]; i++) { if(ff && a[i] != '0')ff = 0; if(!ff)tmpa[tmp++] = a[i]; }tmpa[tmp] = '\0'; ff = 1,tmp = 0; for (int i = 0; b[i]; i++) { if(ff && b[i]!='0')ff = 0; if(!ff)tmpb[tmp++] = b[i]; }tmpb[tmp] = '\0'; al = strlen(tmpa); bl = strlen(tmpb); len = al>bl?al:bl; for (int i = 0; i < al; i++) d[i] = tmpa[al-i-1]-'0';//反轉儲存,把字元型變成int型 for (int i = 0; i < bl; i++) e[i] = tmpb[bl-i-1]-'0'; for (int i = 0; i < len; i++) {//模擬加法 f[i] += d[i] + e[i]; if(f[i]>=10) {//進位 f[i+1]++; f[i] -= 10; } } if(f[len])len++;//可能多一位 for (int i = 0; i < len; i++) c[i] = f[len-i-1]+'0'; c[len] = '\0'; } void minus(char *a, char *b, char *c) { int al = 0,bl = 0; char d[1000]={NULL},e[1000] = {NULL}; int flag = 0;//判斷正負,flag = 0表示結果為正,同理1。 char tmpa[1000] = {NULL},tmpb[1000] = {NULL}; int tmp = 0; int f = 1;//前導零的消去 for (int i = 0; a[i]; i++) //******************************************************* { //*比較減法的結果是正還是負,不能直接用字串的長度 * if(f && a[i] != '0')f = 0; //*因為有前導零,可以使得數值較小的數 佔用的 長度更長。 * if(!f)tmpa[tmp++] = a[i]; //* * }tmpa[tmp] = '\0'; //* * f = 1,tmp = 0; //* * for (int i = 0; b[i]; i++) //* * { //* * if(f && b[i]!='0')f = 0; //* * if(!f)tmpb[tmp++] = b[i]; //* * }tmpb[tmp] = '\0'; //* * al = strlen(tmpa); //* * bl = strlen(tmpb); //*******************************************************/ if(strcmp(tmpa,tmpb) == 0){//首先判斷相等的情況 c[0] = '0'; c[1] = '\0'; return ; } if(al<bl || (al == bl&&strcmp(tmpa,tmpb) < 0)) flag = 1;//為負 if(!flag){//為正 時。 for (int i = 0; i <= al; i++)//把位數少的補上前導零,如1010 - 98變成1010 - 0098. { if(i<al-bl) d[i] = '0'; else d[i] = tmpb[i-al+bl]; } for (int i = al-1; i >= 0; i--)//模擬減法 { if(tmpa[i] >= d[i]) tmpa[i] -= d[i]-'0'; else{ tmpa[i-1] -= 1;//退位 tmpa[i] += 10-d[i]+'0'; } } int tmp = 1,x = 0;//用於處理結果中的前導零 for (int i = 0; i < al; i++) { if(tmpa[i] == '0' && tmp) continue; else{ c[x++] = tmpa[i]; tmp = 0; } }c[x] = '\0';//結束 }else{//為負 時 //好像能直接呼叫一下minus(b,a,c),再加個減號就行了??? for (int i = 0; i <= bl; i++)//同上面一樣~~ { if(i<bl-al) e[i] = '0'; else e[i] = tmpa[i-bl+al]; } for (int i = bl-1; i >= 0; i--) { if(tmpb[i] >= e[i]) tmpb[i] -= e[i]-'0'; else{ tmpb[i-1] -= 1; tmpb[i] += 10-e[i]+'0'; } } int tmp = 1,x = 1; c[0] = '-';//加個減號就行 for (int i = 0; i < bl; i++) { if(tmpb[i] == '0' && tmp) continue; else{ c[x++] = tmpb[i]; tmp = 0; } }c[x] = '\0'; } }