1. 程式人生 > >高精度庫(支援小數、負數、整數、判斷質數、階乘、孿生質數等)

高精度庫(支援小數、負數、整數、判斷質數、階乘、孿生質數等)

吐槽

  喪心病狂的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 #endif
My_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 #endif
My_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