高精度庫(支援小數、負數、整數、判斷質數、階乘、孿生質數等)
吐槽
喪心病狂的C語言課設……
基本我寫了全部後端程式碼,加加的前端程式碼還可以繼續精簡(先留坑)
百度文庫那些貨色居然都好意思要¥30?真不要臉。加加也是不容易,在旁邊不知幹嘛的好,還讓他破費了30……
而且這快一千行的玩意讓我畫流程圖?我用AutoFlowChart都生成了了43MB的BMP格式圖片,手畫那真的是謀殺……
這是主函式流程圖的縮圖……那麼簡單的原理,非要弄個那麼難懂的流程圖
程式碼文件(霧)
分為兩個標頭檔案,分別處理整數和小數
整數
資料儲存方式——一個結構體,三個成員
num——數字主體
flag——正負號,大於等於零為1,小於零為-1(即0為+0)
len——數字長度
支援操作
輸入輸出(input(),output())——能過濾或矯正一些非法輸入,詳見程式碼
四則運算(plus(),sub(),mult(),divi())(除法可求餘數)(本來乘法想套個FFT的,但ddl緊迫,先留坑啥時候再來填坑)
比較大小(cmp())為了某些程式碼方便,功能為絕對值比較,用法見註釋
判斷質數(is_prime())(很low的試除法,不止除到$\sqrt{n}$,為了省事還一直跑到$n$)
算階乘(fac())(short型的階乘都裝不完吧,結果的上限是$10^{10^{5}}$,可以手改)
求區間內孿生質數(twins_prime()),加了對輸入小於等於零的特判。
除錯(debug()),輸出結構體內部資訊
小數
資料儲存方式——定點小數,規定500位為個位,499位為0.1位,一個結構體4個成員
num——數字主體,長度1000,500位為個位
lena——整數部分長度
lenb——小數部分長度 //例如,123.4567,lena為3,lenb為4.
flag——正負號,大於等於零為1,小於零為-1(即0為+0)
支援操作
輸入輸出(input(),output())——能過濾或矯正一些非法輸入,詳見程式碼
四則運算(plus(),sub(),mult(),divi())(除法提供的第四個引數為保留小數位數,上限大概是500減去除數的lena+lenb
比較大小(cmp())比較兩數絕對值大小,帶符號比較的那部分被我註釋了
除錯(debug()),輸出結構體內部資訊
兩個標頭檔案均支援部分檔案輸入輸出功能,使用方法見前端( 霧 )程式碼(main.cpp)
以上是關於後端兩個庫的簡介,使用方法見前端(其實)
輸入輸出方式
0、不使用檔案
該模式下全部從終端或控制檯輸入輸出
1、使用檔案
輸入輸出均從檔案,使用者自定義兩個檔名,判斷輸入檔案是否存在那裡還沒調好,被我暫時註釋了,由於ddl,就先預設輸入檔案存在。
之後的操作提示資訊依然會顯示在終端,但輸入資料和答案會從檔案讀取和寫入檔案
原理大概是現在終端輸出提示資訊,然後重定向到檔案,輸出答案,再重定向回終端,輸出提示資訊,輸入同理。
這部分暫時不支援終端輸入,輸出到檔案,或檔案輸入,輸出到終端(ddl,ddl,還是ddl……)
我快期末考了,高數還在掛科邊緣掙扎,就不多說,直接上程式碼吧
原始碼
後端
1 #ifndef MY_INTEGER_H 2 #define MY_INTEGER_H 3 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<stdbool.h> 8 9 #ifndef MMSU 10 #define MMSU 11 char inputFileName[300]; 12 char outputFileName[300]; 13 static inline int Max(int a,int b){return a>b?a:b;} 14 static inline int Min(int a,int b){return a>b?b:a;} 15 static inline void swap(int & a,int & b){int t=a;a=b;b=t;} 16 static inline void usefile_out(){freopen(outputFileName,"a",stdout);} 17 static inline void usescreen_out() 18 { 19 //fflush(stdout);//將輸出緩衝區清空 20 #ifdef WINVER 21 freopen( "CON", "w", stdout); 22 #else 23 freopen("/dev/tty","w",stdout); 24 #endif 25 } 26 static inline FILE* usefile_in(){return freopen(inputFileName,"r",stdin);} 27 static inline void usescreen_in() 28 { 29 #ifdef WINVER 30 freopen("CON", "r", stdin); 31 #else 32 freopen("/dev/tty", "r", stdin); 33 #endif 34 } 35 #endif 36 37 struct integer{ 38 int num[100000]; 39 int len;//開區間 40 int flag; 41 integer(){len=0;flag=1;memset(num,0,sizeof(num));} 42 }; 43 typedef struct integer integer; 44 45 void debug(integer *n) 46 { 47 int i; 48 printf("\n*********************\nlen:%d flag:%d \n",n->len,n->flag); 49 for(i=0;i<15;i++) printf("%d:%d\n",i,n->num[i]); 50 printf("**************************\n"); 51 } 52 static void reset(integer *a) 53 { 54 memset(a,0,sizeof(*a)); 55 a->flag=1; 56 } 57 static void carry(integer *a) 58 { 59 int i=0; 60 for(i=0;i<a->len;i++) 61 { 62 if(a->num[i]>9) 63 { 64 a->num[i+1]+=a->num[i]/10; 65 a->num[i]%=10; 66 if(i+1==a->len) a->len++; 67 } 68 } 69 } 70 71 void input(integer *a) 72 { 73 int i,j; 74 char in=getchar(); 75 reset(a); 76 i=0; 77 while(in!='-'&&(in<'0'||in>'9')) in=getchar(); 78 if(in=='-') a->flag=-1; 79 else a->num[i++]=in-'0'; 80 in=getchar(); 81 while(in<='9'&&in>='0') 82 { 83 a->num[i++]=in-'0'; 84 in=getchar(); 85 } 86 j=0; 87 a->len=i; 88 i--; 89 while(i>=j) swap(a->num[i--],a->num[j++]); 90 while(!a->num[a->len-1]&&a->len>0) a->len--; 91 if(a->len==0) a->flag=1; 92 } 93 void output(integer *n) 94 { 95 int i; 96 if(n->flag==-1) 97 printf("-"); 98 if(n->len==0) 99 printf("0"); 100 for(i=n->len-1;i>=0;i--) 101 { 102 printf("%d",n->num[i]); 103 } 104 } 105 int cmp(integer *n1,integer *n2)//絕對值比較 106 { 107 int i; 108 if(n1->len>n2->len) 109 return 1; 110 if(n1->len<n2->len) 111 return 2; 112 for(i=n1->len-1;i>-1;i--) 113 { 114 if(n1->num[i]>n2->num[i]) 115 return 1; 116 if(n1->num[i]<n2->num[i]) 117 return 2; 118 } 119 return 0; 120 } 121 122 void sub(integer *a,integer *b,integer *c); 123 void plus(integer *n1,integer *n2,integer *n3) 124 { 125 int i; 126 reset(n3); 127 if(n1->flag*n2->flag<0)//異號 128 { 129 if(n1->flag<0) 130 { 131 n1->flag=1; 132 sub(n2,n1,n3); 133 n1->flag=-1; 134 return; 135 } 136 else 137 { 138 n2->flag=1; 139 sub(n1,n2,n3); 140 n2->flag=-1; 141 return; 142 } 143 } 144 //同號 145 n3->len=(n1->len<n2->len)?n2->len:n1->len; 146 for(i=0;i<n3->len;i++) 147 { 148 n3->num[i]+=n1->num[i]+n2->num[i]; 149 } 150 carry(n3); 151 n3->flag=n1->flag; 152 } 153 void sub(integer *a,integer *b,integer *c) 154 { 155 int i; 156 reset(c); 157 if(a->flag*b->flag<0)//異號 158 { 159 if(a->flag==-1)//(-5)-3 160 { 161 a->flag=1; 162 plus(a,b,c); 163 a->flag=-1; 164 c->flag=-1; 165 return; 166 } 167 168 else//5-(-3) 169 { 170 b->flag=1; 171 plus(a,b,c); 172 b->flag=-1; 173 return; 174 } 175 } 176 //同號 177 if(a->flag<0)//(-3)-(-5)//同為負 178 { 179 b->flag=1; 180 plus(a,b,c); 181 b->flag=-1; 182 return; 183 } 184 if(cmp(a,b)==2)//3-5同正小減大 185 { 186 sub(b,a,c); 187 c->flag=-1; 188 return; 189 } 190 // 同正大減小 a-b 191 c->len=Max(a->len,b->len); 192 for(i=0;i<c->len;i++) 193 { 194 c->num[i]+=a->num[i]-b->num[i]; 195 if(c->num[i]<0) 196 { 197 c->num[i+1]--; 198 c->num[i]+=10; 199 } 200 } 201 while((!c->num[c->len-1])&&c->len>0) c->len--; 202 } 203 void mult(integer *n1,integer *n2,integer *n3) 204 { 205 int i,j; 206 reset(n3); 207 for(i=0;i<n1->len;i++) 208 { 209 for(j=0;j<n2->len;j++) 210 { 211 n3->num[i+j]+=n1->num[i]*n2->num[j]; 212 } 213 } 214 n3->len=n1->len+n2->len; 215 carry(n3); 216 n3->flag=n1->flag*n2->flag; 217 while(n3->num[n3->len-1]==0&&n3->len>0) n3->len--; 218 if(n3->len==0) n3->flag=1; 219 } 220 void divi(integer *a,integer *b,integer *c,integer *d) 221 { 222 int i,j; 223 integer tempa;//記錄餘數 224 integer tempb;//記錄移位以後 225 integer tempc; 226 reset(&tempb); 227 reset(c);reset(d); 228 tempa=*a; 229 tempa.flag=1; 230 if(b->len==0) 231 { 232 printf("1.#INF\n"); 233 exit(0); 234 } 235 if(a->len==0) return; 236 237 for(i=b->len-1;i>=0;i--) 238 tempb.num[i+a->len-b->len]=b->num[i]; 239 240 tempb.len=a->len; 241 for(i=a->len-b->len;i>=0;i--) 242 { 243 int count=0; 244 while(cmp(&tempb,&tempa)!=1) 245 { 246 reset(&tempc);//記錄減法以後的結果 // 每次建構函式初始化 247 sub(&tempa,&tempb,&tempc); 248 tempa=tempc; 249 count++; 250 } 251 c->num[i]=count;//////////////////////////////////////// 252 for(j=1;j<=tempb.len;j++) 253 tempb.num[j-1]=tempb.num[j]; 254 tempb.num[tempb.len--]=0; 255 } 256 c->flag=a->flag*b->flag; 257 *d=tempa; 258 c->len=a->len; 259 while(!c->num[c->len-1]&&c->len>0) c->len--; 260 if(c->len==0) c->flag=1; 261 } 262 263 bool is_prime(integer *a)//判斷質數 264 { 265 integer i,q,r; 266 267 if(a->len==1) 268 { 269 if(a->num[0]<2) return false; 270 if(a->num[0]==2) return true; 271 } 272 273 i.len=1; 274 i.num[0]=2; 275 while(cmp(a,&i)==1) 276 { 277 divi(a,&i,&q,&r); 278 if(r.len==0) return false; 279 i.num[0]++; 280 carry(&i); 281 } 282 return true; 283 } 284 285 void twins_prime(integer *l,integer *r,int ff)//閉區間//含輸出 286 { 287 printf("^^^"); 288 int tot=0; 289 integer i1,i2; 290 printf("Wait for a while...\n"); 291 fflush(stdout); 292 if(ff) usefile_out(); 293 if(r->flag<0) 294 { 295 printf("Not Found\n\n"); 296 return; 297 } 298 299 if(l->flag<0) 300 { 301 i1.num[0]=3; 302 i2.num[0]=5; 303 i1.len=1; 304 i2.len=1; 305 } 306 else if(l->len<=1&&l->num[0]<3) 307 { 308 i1.num[0]=3,i2.num[0]=5,i1.len=1,i2.len=1; 309 } 310 else if(l->num[0]&1)//是奇數 311 { 312 i2=i1=*l; 313 i2.num[0]+=2; 314 carry(&i2); 315 } 316 else 317 { 318 i1=*l; 319 i1.num[0]++; 320 carry(&i1); 321 i2=i1; 322 i2.num[0]+=2; 323 carry(&i2); 324 } 325 while(cmp(&i2,r)!=1) 326 { 327 if(is_prime(&i1)&&is_prime(&i2)) 328 { 329 tot++; 330 printf("%d::\t( ",tot);output(&i1);printf("\t\t\t, ");output(&i2);printf("\t\t)\n"); 331 } 332 i1=i2; 333 i2.num[0]+=2; 334 carry(&i2); 335 } 336 if(!tot) printf("Not Found\n\n"); 337 if(ff) 338 { 339 printf("\n"); 340 usescreen_out(); 341 } 342 printf("完成!\n"); 343 } 344 345 void fac(int n,integer *n3) 346 { 347 int i,j; 348 reset(n3); 349 if(n<=0) 350 { 351 n3->num[0]=1; 352 n3->len=0; 353 n3->flag=1; 354 return; 355 } 356 n3->num[0]=1; 357 n3->len=1; 358 n3->flag=1; 359 for(i=1;i<=n;i++) 360 { 361 for(j=0;j<n3->len;j++) 362 { 363 n3->num[j]*=i; 364 } 365 carry(n3); 366 } 367 } 368 #endifMy_integer.h
1 #ifndef MY_DECIMAL_H 2 #define MY_DECIMAL_H 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 #include<string.h> 7 8 #ifndef MMSU 9 #define MMSU 10 char inputFileName[300]; 11 char outputFileName[300]; 12 static inline int Max(int a,int b){return a>b?a:b;} 13 static inline int Min(int a,int b){return a>b?b:a;} 14 static inline void swap(int & a,int & b){int t=a;a=b;b=t;} 15 static inline void usefile_out(){freopen(outputFileName,"a",stdout);} 16 static inline void usescreen_out() 17 { 18 fflush(stdout);//將輸出緩衝區清空 19 #ifdef WINVER 20 freopen( "CON", "w", stdout); 21 #else 22 freopen("/dev/tty","w",stdout); 23 #endif 24 } 25 static inline void usefile_in(){freopen(inputFileName,"r",stdin);} 26 static inline void usescreen_in() 27 { 28 #ifdef WINVER 29 freopen( "CON", "r", stdout); 30 #else 31 freopen("/dev/tty","r",stdout); 32 #endif 33 } 34 #endif 35 36 struct BigNumber{//定點高精度小數"類" 37 int num[1000];//num[500]為個位,平時存數值,輸入輸出時用%d 38 int lena,lenb;//閉區間,a為整數部分,b為小數部分 39 int flag; 40 }; 41 typedef struct BigNumber BigNumber; 42 void debug(BigNumber a) 43 { 44 printf("\n*********************\nflag::%d lena::%d lenb::%d\n",a.flag,a.lena,a.lenb); 45 for(int ii=490;ii<=510;ii++) printf("%d::%d\n",ii,a.num[ii]); 46 printf("**********************\n"); 47 } 48 static void reset(BigNumber *a) 49 { 50 memset(a,0,sizeof(*a)); 51 a->flag=1; 52 } 53 void input(BigNumber *a) 54 { 55 int i,j; 56 char in=getchar(); 57 reset(a); 58 i=500; 59 while(in!='-'&&(in<'0'||in>'9')) in=getchar(); 60 if(in=='-') a->flag=-1; 61 else a->num[i++]=in-'0'; 62 in=getchar(); 63 while(in<='9'&&in>='0') 64 { 65 a->num[i++]=in-'0'; 66 in=getchar(); 67 } 68 69 j=500; 70 a->lena=i-500; 71 i--; 72 while(i>=j) swap(a->num[i--],a->num[j++]); 73 while(!a->num[a->lena+499]&&a->lena>0) a->lena--; 74 i=499; 75 if(in!='.') 76 { 77 if(a->lena==0) a->flag=1; 78 return; 79 } 80 in=getchar(); 81 while(in<='9'&&in>='0') 82 { 83 a->num[i--]=in-'0'; 84 in=getchar(); 85 } 86 a->lenb=500-i; 87 while(!a->num[500-a->lenb]&&a->lenb>0)a->lenb--; 88 if(a->lena==0&&a->lenb==0) a->flag=1; 89 return; 90 } 91 void output(BigNumber *a) 92 { 93 int i; 94 if(a->flag==-1&&(a->lena|a->lenb)) printf("-"); 95 if(!a->lena) printf("0"); 96 else 97 { 98 i=a->lena+499; 99 while(i>=500)printf("%d",a->num[i--]); 100 } 101 printf("."); 102 if(!a->lenb) 103 { 104 printf("0"); 105 return; 106 } 107 i=499; 108 while(i>=500-a->lenb) printf("%d",a->num[i--]); 109 return; 110 } 111 int cmp(BigNumber *a , BigNumber *b)//比較絕對值,0相等,1a大,2b大 112 { 113 int i; 114 // if(a->flag*b->flag==-1)//異號 115 // { 116 // if(a->flag==-1) return 2; 117 // else return 1; 118 // } 119 if(a->lena>b->lena) 120 { 121 // if(a->flag>0) 122 return 1; 123 //else return 2; 124 } 125 else if(a->lena<b->lena) 126 { 127 // if(a->flag>0) 128 return 2; 129 //else return 1; 130 } 131 132 int end=Min(500-a->lenb,500-b->lenb); 133 for(i=a->lena+500;i>=end;i--) 134 { 135 if(a->num[i]>b->num[i]) 136 { 137 // if(a->flag>0) 138 return 1; 139 // else return 2; 140 } 141 else if(a->num[i]<b->num[i]) 142 { 143 // if(a->flag>0) 144 return 2; 145 // else return 1; 146 } 147 } 148 return 0; 149 } 150 void sub(BigNumber *a,BigNumber *b,BigNumber *c); 151 void plus(BigNumber *a,BigNumber *b,BigNumber *c) 152 { 153 int i; 154 reset(c); 155 if(a->flag*b->flag<0)//異號 156 { 157 if(a->flag<0) 158 { 159 a->flag=1; 160 sub(b,a,c); 161 a->flag=-1; 162 return; 163 } 164 else 165 { 166 b->flag=1; 167 sub(a,b,c); 168 b->flag=-1; 169 return; 170 } 171 } 172 //同號 173 c->lenb=Max(a->lenb,b->lenb);//c的小數部分長度 174 c->lena=Max(a->lena,b->lena); 175 for(i=500-c->lenb;i<=c->lena+500;i++) 176 { 177 c->num[i]+=a->num[i]+b->num[i]; 178 if(c->num[i]>9) 179 { 180 c->num[i+1]++; 181 c->num[i]%=10; 182 if(i==c->lena+499) c->lena++; 183 } 184 } 185 c->flag=a->flag; 186 } 187 void sub(BigNumber *a,BigNumber *b,BigNumber *c) 188 { 189 int i; 190 reset(c); 191 if(a->flag*b->flag<0)//異號 192 { 193 if(a->flag==-1)//(-5)-3 194 { 195 a->flag=1; 196 plus(a,b,c); 197 a->flag=-1; 198 c->flag=-1; 199 return; 200 } 201 202 else//5-(-3) 203 { 204 b->flag=1; 205 plus(a,b,c); 206 b->flag=-1; 207 return; 208 } 209 } 210 //同號 211 if(a->flag<0)//(-3)-(-5)//同為負 212 { 213 b->flag=1; 214 plus(a,b,c); 215 b->flag=-1; 216 return; 217 } 218 if(cmp(a,b)==2)//3-5同正小減大 219 { 220 sub(b,a,c); 221 c->flag=-1; 222 return; 223 } 224 // 同正大減小 a-b 225 c->lenb=Max(a->lenb,b->lenb); 226 c->lena=Max(a->lena,b->lena); 227 for(i=500-c->lenb;i<=c->lena+499;i++) 228 { 229 c->num[i]+=a->num[i]-b->num[i]; 230 if(c->num[i]<0) 231 { 232 c->num[i+1]--; 233 c->num[i]+=10; 234 } 235 } 236 while((!c->num[c->lena+499])&&c->lena>0) c->lena--; 237 while((!c->num[500-c->lenb])&&c->lenb>0) c->lenb--; 238 } 239 void mult(BigNumber *a,BigNumber *b,BigNumber *c) 240 { 241 int i,j; 242 int *aa=a->num+500,*bb=b->num+500,*cc=c->num+500; 243 reset(c); 244 for(i=-a->lenb;i<=a->lena;i++) 245 { 246 for(j=-b->lenb;j<=b->lena;j++) 247 { 248 cc[i+j]+=aa[i]*bb[j]; 249 } 250 } 251 for(i=0;c->num[i]==0&&i<500;i++); 252 if(i==500) c->lenb=0; 253 else c->lenb=500-i; 254 255 for(c->lena=499;c->lena>0&&c->num[c->lena+499]==0;c->lena--); 256 257 for(;i<=c->lena+500;i++) 258 { 259 if(c->num[i]>9) 260 { 261 c->num[i+1]+=c->num[i]/10; 262 c->num[i]%=10; 263 if(i==c->lena+499) c->lena++; 264 } 265 } 266 c->flag=a->flag*b->flag; 267 } 268 void divi(BigNumber *a,BigNumber *b,BigNumber *c,int n)//n受限於ab位數之差等因素,未對低位進行捨棄,預設裝得下 269 { 270 int i,j; 271 BigNumber tempa=*a;//記錄餘數 272 BigNumber tempb;//記錄移位以後 273 reset(c); 274 if(b->lena==0&&b->lenb==0) 275 { 276 printf("1.#INF\n");//故弄玄虛的除零報錯 277 exit(0); 278 } 279 for(i=b->lena+499;i>=500-b->lenb;i--) 280 { 281 tempb.num[i+a->lena-b->lena]=b->num[i]; 282 } 283 tempb.lena=a->lena; 284 tempb.lenb=2*b->lenb-a->lenb; 285 if(tempb.lenb<0) tempb.lenb=0; 286 for(i=a->lena-b->lena+500;i>=500-n;i--) 287 { 288 int count=0; 289 //向右移1位b,減到不能減為止 290 while(cmp(&tempb,&tempa)!=1) 291 { 292 BigNumber tempc;//記錄減法以後的結果 // 每次建構函式初始化 293 sub(&tempa,&tempb,&tempc); 294 tempa=tempc; 295 count++; 296 } 297 c->num[i]=count; 298 for(j=500-tempb.lenb;j<=tempb.lena+499;j++) 299 tempb.num[j-1]=tempb.num[j]; 300 tempb.num[tempb.lena+499]=0; 301 if(tempb.lena>0) tempb.lena--; 302 if(tempb.num[500-tempb.lenb-1]) tempb.lenb++; 303 } 304 305 c->flag=a->flag*b->flag; 306 c->lena=500; 307 while(!c->num[c->lena+499]&&c->lena>0) c->lena--; 308 c->lenb=500; 309 while((!c->num[500-c->lenb])&&c->lenb>0) c->lenb--; 310 } 311 #endifMy_decimal.h
前端
1 #include<stdio.h> 2 #include"My_decimal.h" 3 #include"My_integer.h" 4 5 int main() 6 { 7 int i, ff, ffin; 8 integer n1, n2, n3, n4; 9 BigNumber m1, m2, m3; 10 11 printf("是否從檔案讀入資料並存入檔案?1/0 "); 12 scanf("%d", &ffin); 13 ff = ffin; 14 if (ffin) 15 { 16 printf("儲存資料的檔名稱: "); 17 scanf("%s", inputFileName); 18 // if(usefile_in()==NULL) 19 // { 20 // usescreen_in(); 21 // printf("找不到檔案!\n"); 22 // return 0; 23 // } 24 // usescreen_in(); 25 } 26 27 // printf("是否將結果輸出到檔案?1/0 "); 28 // scanf("%d",&ff); 29 if (ff) 30 { 31 printf("輸入儲存答案的檔名稱: "); 32 scanf("%s", outputFileName); 33 } 34 35 while (1) 36 { 37 printf("進行整數運算請輸入1,進行小數運算請輸入2\n"); 38 scanf("%d", &i); 39 if (i == 1) 40 { 41 printf("~請選擇整數運算~\n計算a+b請輸入1"); 42 printf("\n計算a-b請輸入2"); 43 printf("\n計算a*b請輸入3"); 44 printf("\n計算a/b請輸入4"); 45 printf("\n計算a的階乘請輸入5"); 46 printf("\n計算孿生質數請輸入6\n"); 47 scanf("%d", &i); 48 if (i == 1) 49 { 50 if (ffin) 51 usefile_in(); 52 if (!ffin) 53 printf("請輸入一個數"); 54 input(&n1); 55 if (!ffin) 56 printf("請輸入一個數"); 57 input(&n2); 58 if (ffin) 59 usescreen_in(); 60 plus(&n1, &n2, &n3); 61 if (ff) 62 usefile_out(); 63 putchar('('); 64 output(&n1); 65 putchar(')'); 66 putchar('+'); 67 putchar('('); 68 output(&n2); 69 putchar(')'); 70 putchar('='); 71 output(&n3); 72 printf("\n"); 73 if (ff) 74 { 75 usescreen_out(); 76 printf("完成!\n"); 77 } 78 } 79 else if (i == 2) 80 { 81 if (ffin) 82 usefile_in(); 83 if (!ffin) 84 printf("請輸入一個數"); 85 input(&n1); 86 if (!ffin) 87 printf("請輸入一個數"); 88 input(&n2); 89 if (ffin) 90 usescreen_in(); 91 sub(&n1, &n2, &n3); 92 if (ff) 93 usefile_out(); 94 putchar('('); 95 output(&n1); 96 putchar(')'); 97 putchar('-'); 98 putchar('('); 99 output(&n2); 100 putchar(')'); 101 putchar('='); 102 output(&n3); 103 printf("\n"); 104 if (ff) 105 { 106 usescreen_out(); 107 printf("完成!\n"); 108 } 109 } 110 else if (i == 3) 111 { 112 if (ffin) 113 usefile_in(); 114 if (!ffin) 115 printf("請輸入一個數"); 116 input(&n1); 117 if (!ffin) 118 printf("請輸入一個數"); 119 input(&n2); 120 if (ffin) 121 usescreen_in(); 122 mult(&n1, &n2, &n3); 123 if (ff) 124 usefile_out(); 125 putchar('('); 126 output(&n1); 127 putchar(')'); 128 printf("×"); 129 putchar('('); 130 output(&n2); 131 putchar(')'); 132 putchar('='); 133 output(&n3); 134 printf("\n"); 135 if (ff) 136 { 137 usescreen_out(); 138 printf("完成!\n"); 139 } 140 } 141 else if (i == 4) 142 { 143 if (ffin) 144 usefile_in(); 145 if (!ffin) 146 printf("請輸入一個數"); 147 in