高精度库(支持小数、负数、整数、判断质数、阶乘、孪生质数等)

吐槽

  丧心病狂的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(){fflush(stdout);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("
*********************
len:%d  flag:%d  
",n->len,n->flag);
 49     for(i=0;i<15;i++) printf("%d:%d
",i,n->num[i]);
 50     printf("**************************
");
 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
");
233         exit(0);
234     }
235     if(a->len==0) return;
236     
237     for(i=b->len-1;i>=0;i--)
238     {
239         tempb.num[i+a->len-b->len]=b->num[i];
240         tempb.len=a->len;
241     }
242     for(i=a->len-b->len;i>=0;i--)
243     {
244         int count=0;
245         while(cmp(&tempb,&tempa)!=1)
246         {
247             reset(&tempc);//记录减法以后的结果 // 每次构造函数初始化
248             sub(&tempa,&tempb,&tempc);
249             tempa=tempc;
250             count++;
251         }
252         c->num[i]=count;
253         for(j=1;j<=tempb.len;j++)
254             tempb.num[j-1]=tempb.num[j];
255         tempb.num[tempb.len--]=0;
256     }
257     c->flag=a->flag*b->flag;
258     *d=tempa;
259     c->len=a->len;
260     while(!c->num[c->len-1]&&c->len>0) c->len--;
261     if(c->len==0) c->flag=1;
262 }
263 
264 bool is_prime(integer *a)//判断质数
265 {
266     integer i,q,r;
267     
268     if(a->len==1)
269     {
270         if(a->num[0]<2) return false;
271         if(a->num[0]==2) return true;
272     }
273     
274     i.len=1;
275     i.num[0]=2;
276     while(cmp(a,&i)==1)
277     {
278         divi(a,&i,&q,&r);
279         if(r.len==0) return false;
280         i.num[0]++;
281         carry(&i);
282     }
283     return true;
284 }
285 
286 void twins_prime(integer *l,integer *r)//闭区间//含输出
287 {
288     int tot=0;
289     integer i1,i2;
290     if(r->flag<0)
291     {
292         printf("Not Found

");
293         return;
294     }
295     
296     if(l->flag<0)
297     {
298         i1.num[0]=3;
299         i2.num[0]=5;
300         i1.len=1;
301         i2.len=1;
302     }
303     else if(l->len<=1&&l->num[0]<3)
304     {
305         i1.num[0]=3,i2.num[0]=5,i1.len=1,i2.len=1;
306     }
307     else if(l->num[0]&1)//是奇数
308     {
309         i2=i1=*l;
310         i2.num[0]+=2;
311         carry(&i2);
312     }
313     else
314     {
315         i1=*l;
316         i1.num[0]++;
317         carry(&i1);
318         i2=i1;
319         i2.num[0]+=2;
320         carry(&i2);
321     }
322     while(cmp(&i2,r)!=1)
323     {
324         if(is_prime(&i1)&&is_prime(&i2))
325         {
326             tot++;
327             printf("%d:	(  ",tot);output(&i1);printf("			, ");output(&i2);printf("		)
");
328         }
329         i1=i2;
330         i2.num[0]+=2;
331         carry(&i2);
332     }
333     if(!tot) printf("Not Found

");
334     return;
335 }
336 
337 void fac(int n,integer *n3)
338 {
339     int i,j;
340     reset(n3);
341     if(n<=0)
342     {
343         n3->num[0]=1;
344         n3->len=0;
345         n3->flag=1;
346         return;
347     }
348     n3->num[0]=1;
349     n3->len=1;
350     n3->flag=1;
351     for(i=1;i<=n;i++)
352     {
353         for(j=0;j<n3->len;j++)
354         {
355             n3->num[j]*=i;
356         }
357         carry(n3);
358     }
359 }
360 #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(){fflush(stdout);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 FILE* usefile_in(){return freopen(inputFileName,"r",stdin);}
 26 static inline void usescreen_in()
 27 {
 28     #ifdef WINVER
 29     freopen("CON", "r", stdin);
 30     #else
 31     freopen("/dev/tty", "r", stdin); 
 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("
*********************
flag::%d  lena::%d  lenb::%d
",a.flag,a.lena,a.lenb);
 45     for(int ii=490;ii<=510;ii++) printf("%d::%d
",ii,a.num[ii]);
 46     printf("**********************
");
 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 }
 90 void output(BigNumber *a)
 91 {
 92     int i;
 93     if(a->flag==-1&&(a->lena|a->lenb)) printf("-");
 94     if(!a->lena) printf("0");
 95     else
 96     {
 97         i=a->lena+499;
 98         while(i>=500)printf("%d",a->num[i--]);
 99     }
100     printf(".");
101     if(!a->lenb)
102     {
103         printf("0");
104         return;
105     }
106     i=499;
107     while(i>=500-a->lenb) printf("%d",a->num[i--]);
108     return;
109 }
110 int cmp(BigNumber *a , BigNumber *b)//比较绝对值,0相等,1a大,2b大
111 {
112     int i;
113     // if(a->flag*b->flag==-1)//异号
114     // {
115     //     if(a->flag==-1) return 2;
116     //     else return 1;
117     // }
118     if(a->lena>b->lena)
119     {
120         // if(a->flag>0)
121         return 1;
122         //else return 2;
123     }
124     else if(a->lena<b->lena)
125     {
126         // if(a->flag>0)
127         return 2;
128         //else return 1;
129     }
130     
131     int end=Min(500-a->lenb,500-b->lenb);
132     for(i=a->lena+500;i>=end;i--)
133     {
134         if(a->num[i]>b->num[i])
135         {
136             // if(a->flag>0)
137             return 1;
138             // else return 2;
139         }
140         else if(a->num[i]<b->num[i])
141         {
142             // if(a->flag>0)
143             return 2;
144             // else return 1;
145         }
146     }
147     return 0;
148 }
149 void sub(BigNumber *a,BigNumber *b,BigNumber *c);
150 void plus(BigNumber *a,BigNumber *b,BigNumber *c)
151 {
152     int i;
153     reset(c);
154     if(a->flag*b->flag<0)//异号
155     {
156         if(a->flag<0)
157         {
158             a->flag=1;
159             sub(b,a,c);
160             a->flag=-1;
161             return;
162         }
163         else
164         {
165             b->flag=1;
166             sub(a,b,c);
167             b->flag=-1;
168             return;
169         }
170     }
171     //同号
172     c->lenb=Max(a->lenb,b->lenb);//c的小数部分长度
173     c->lena=Max(a->lena,b->lena);
174     for(i=500-c->lenb;i<=c->lena+500;i++)
175     {
176         c->num[i]+=a->num[i]+b->num[i];
177         if(c->num[i]>9)
178         {
179             c->num[i+1]++;
180             c->num[i]%=10;
181             if(i==c->lena+499) c->lena++;
182         }
183     }
184     c->flag=a->flag;
185 }
186 void sub(BigNumber *a,BigNumber *b,BigNumber *c)
187 {
188     int i;
189     reset(c);
190     if(a->flag*b->flag<0)//异号
191     {
192         if(a->flag==-1)//(-5)-3
193         {
194             a->flag=1;
195             plus(a,b,c);
196             a->flag=-1;
197             c->flag=-1;
198             return;
199         }
200 
201         else//5-(-3)
202         {
203             b->flag=1;
204             plus(a,b,c);
205             b->flag=-1;
206             return;
207         }
208     }
209     //同号
210     if(a->flag<0)//(-3)-(-5)//同为负
211     {
212         b->flag=1;
213         plus(a,b,c);
214         b->flag=-1;
215         return;
216     }
217     if(cmp(a,b)==2)//3-5同正小减大
218     {
219         sub(b,a,c);
220         c->flag=-1;
221         return;
222     }
223     // 同正大减小 a-b
224     c->lenb=Max(a->lenb,b->lenb);
225     c->lena=Max(a->lena,b->lena);
226     for(i=500-c->lenb;i<=c->lena+499;i++)
227     {
228         c->num[i]+=a->num[i]-b->num[i];
229         if(c->num[i]<0)
230         {
231             c->num[i+1]--;
232             c->num[i]+=10;
233         }
234     }
235     while((!c->num[c->lena+499])&&c->lena>0) c->lena--;
236     while((!c->num[500-c->lenb])&&c->lenb>0) c->lenb--;
237 }
238 void mult(BigNumber *a,BigNumber *b,BigNumber *c)
239 {
240     int i,j;
241     int *aa=a->num+500,*bb=b->num+500,*cc=c->num+500;
242     reset(c);
243     for(i=-a->lenb;i<=a->lena;i++)
244     {
245         for(j=-b->lenb;j<=b->lena;j++)
246         {
247             cc[i+j]+=aa[i]*bb[j];
248         }
249     }
250     for(i=0;c->num[i]==0&&i<500;i++);
251     if(i==500) c->lenb=0;
252     else c->lenb=500-i;
253     
254     for(c->lena=499;c->lena>0&&c->num[c->lena+499]==0;c->lena--);
255     
256     for(;i<=c->lena+500;i++)
257     {
258         if(c->num[i]>9)
259         {
260             c->num[i+1]+=c->num[i]/10;
261             c->num[i]%=10;
262             if(i==c->lena+499) c->lena++;
263         }
264     }
265     c->flag=a->flag*b->flag;
266 }
267 void divi(BigNumber *a,BigNumber *b,BigNumber *c,int n)//n受限于ab位数之差,未对低位进行舍弃,默认装得下
268 {
269     int i,j;
270     BigNumber tempa=*a;//记录余数
271     BigNumber tempb;//记录移位以后
272     reset(c);
273     if(b->lena==0&&b->lenb==0)
274     {
275         printf("1.#INF
");
276         exit(0);
277     }
278     for(i=b->lena+499;i>=500-b->lenb;i--)
279     {
280         tempb.num[i+a->lena-b->lena]=b->num[i];
281     }
282     tempb.lena=a->lena;
283     tempb.lenb=2*b->lenb-a->lenb;
284     if(tempb.lenb<0) tempb.lenb=0;
285     for(i=a->lena-b->lena+500;i>=500-n;i--)
286     {
287         int count=0;
288         //向右移1位b,减到不能减为止
289         while(cmp(&tempb,&tempa)!=1)
290         {
291             BigNumber tempc;//记录减法以后的结果 // 每次构造函数初始化
292             sub(&tempa,&tempb,&tempc);
293             tempa=tempc;
294             count++;
295         }
296         c->num[i]=count;
297         for(j=500-tempb.lenb;j<=tempb.lena+499;j++)
298             tempb.num[j-1]=tempb.num[j];
299         tempb.num[tempb.lena+499]=0;
300         if(tempb.lena>0) tempb.lena--;
301         if(tempb.num[500-tempb.lenb-1]) tempb.lenb++;
302     }
303 
304     c->flag=a->flag*b->flag;
305     c->lena=500;
306     while(!c->num[c->lena+499]&&c->lena>0) c->lena--;
307     c->lenb=500;
308     while((!c->num[500-c->lenb])&&c->lenb>0) c->lenb--;
309 }
310 #endif
My_decimal.h

  前端

  1 #include<stdio.h>
  2 #include "My_decimal.h"
  3 #include "My_integer.h"
  4 int main()
  5 {
  6     int i, ff, ffin;
  7     integer n1, n2, n3, n4;
  8     BigNumber m1, m2, m3;
  9 
 10     printf("是否从文件读入数据并存入文件?1/0 ");
 11     scanf("%d", &ffin);
 12     if (ffin)
 13     {
 14         printf("储存数据的文件名称: ");
 15         scanf("%s", inputFileName);
 16         if(usefile_in()==NULL)
 17         {
 18             usescreen_in();
 19             printf("找不到文件!
");
 20             return 0;
 21         }
 22         usescreen_in();
 23     }
 24     
 25     ff = ffin;
 26     // printf("是否将结果输出到文件?1/0 ");
 27     // scanf("%d",&ff);
 28     if (ff)
 29     {
 30         printf("输入储存答案的文件名称: ");
 31         scanf("%s", outputFileName);
 32     }
 33 
 34     while (1)
 35     {
 36         printf("进行整数运算请输入1,进行小数运算请输入2
");
 37         scanf("%d", &i);
 38         if (i == 1)
 39         {
 40             printf("~请选择整数运算~
计算a+b请输入1");
 41             printf("
计算a-b请输入2");
 42             printf("
计算a*b请输入3");
 43             printf("
计算a/b请输入4");
 44             printf("
计算a的阶乘请输入5");
 45             printf("
计算孪生质数请输入6
");
 46             scanf("%d", &i);
 47             if (i == 1)
 48             {
 49                 if (ffin)
 50                     usefile_in();
 51                 if (!ffin)
 52                     printf("请输入一个数");
 53                 input(&n1);
 54                 if (!ffin)
 55                     printf("请输入一个数");
 56                 input(&n2);
 57                 if (ffin)
 58                     usescreen_in();
 59                 plus(&n1, &n2, &n3);
 60                 if (ff)
 61                     usefile_out();
 62                 putchar('(');
 63                 output(&n1);
 64                 putchar(')');
 65                 putchar('+');
 66                 putchar('(');
 67                 output(&n2);
 68                 putchar(')');
 69                 putchar('=');
 70                 output(&n3);
 71                 printf("
");
 72                 if (ff)
 73                 {
 74                     usescreen_out();
 75                     printf("完成!
");
 76                 }
 77             }
 78             else if (i == 2)
 79             {
 80                 if (ffin)
 81                     usefile_in();
 82                 if (!ffin)
 83                     printf("请输入一个数");
 84                 input(&n1);
 85                 if (!ffin)
 86                     printf("请输入一个数");
 87                 input(&n2);
 88                 if (ffin)
 89                     usescreen_in();
 90                 sub(&n1, &n2, &n3);
 91                 if (ff)
 92                     usefile_out();
 93                 putchar('(');
 94                 output(&n1);
 95                 putchar(')');
 96                 putchar('-');
 97                 putchar('(');
 98                 output(&n2);
 99                 putchar(')');
100                 putchar('=');
101                 output(&n3);
102                 printf("
");
103                 if (ff)
104                 {
105                     usescreen_out();
106                     printf("完成!
");
107                 }
108             }
109             else if (i == 3)
110             {
111                 if (ffin)
112                     usefile_in();
113                 if (!ffin)
114                     printf("请输入一个数");
115                 input(&n1);
116                 if (!ffin)
117                     printf("请输入一个数");
118                 input(&n2);
119                 if (ffin)
120                     usescreen_in();
121                 mult(&n1, &n2, &n3);
122                 if (ff)
123                     usefile_out();
124                 putchar('(');
125                 output(&n1);
126                 putchar(')');
127                 printf("×");
128                 putchar('(');
129                 output(&n2);
130                 putchar(')');
131                 putchar('=');
132                 output(&n3);
133                 printf("
");
134                 if (ff)
135                 {
136                     usescreen_out();
137                     printf("完成!
");
138                 }
139             }
140             else if (i == 4)
141             {
142                 if (ffin)
143                     usefile_in();
144                 if (!ffin)
145                     printf("请输入一个数");
146                 input(&n1);
147                 if (!ffin)
148                     printf("请输入一个数");
149                 input(&n2);
150                 if (ffin)
151                     usescreen_in();
152                 divi(&n1, &n2, &n3, &n4);
153                 if (ff)
154                     usefile_out();
155                 putchar('(');
156                 output(&n1);
157                 putchar(')');
158                 printf("÷");
159                 putchar('(');
160                 output(&n2);
161                 putchar(')');
162                 putchar('=');
163                 output(&n3);
164                 printf("………………");
165                 output(&n4);
166                 printf("
");
167                 if (ff)
168                 {
169                     usescreen_out();
170                     printf("完成!
");
171                 }
172             }
173             else if (i == 5)
174             {
175                 if (ffin)
176                     usefile_in();
177                 if (!ffin)
178                     printf("输入一个正整数:");
179                 scanf("%d", &i);
180                 if (ffin)
181                     usescreen_in();
182                 fac(i, &n3);
183                 if (ff)
184                     usefile_out();
185                 printf("(%d)!=", i);
186                 output(&n3);
187                 printf("
");
188                 if (ff)
189                 {
190                     usescreen_out();
191                     printf("完成!
");
192                 }
193             }
194             else if (i == 6)
195             {
196                 if (ffin)
197                     usefile_in();
198                 if (!ffin)
199                     printf("请输入下界");
200                 input(&n1);
201                 if (!ffin)
202                     printf("请输入上界");
203                 input(&n2);
204                 if (ffin)
205                     usescreen_in();    
206                 if(ff)
207                     printf("Wait for a while...
");
208                 if (ff)
209                     usefile_out();
210                 twins_prime(&n1, &n2);
211                 if (ff)
212                     usescreen_out();
213                 printf("孪生质数计算完成!
");
214             }
215         }
216         else if (i == 2)
217         {
218             printf("~请选择小数运算~
计算a+b请输入1");
219             printf("
计算a-b请输入2");
220             printf("
计算a*b请输入3");
221             printf("
计算a/b请输入4
");
222             scanf("%d", &i);
223             if (i == 1)
224             {
225                 if (ffin)
226                     usefile_in();
227                 if (!ffin)
228                     printf("请输入一个数");
229                 input(&m1);
230                 if (!ffin)
231                     printf("请输入一个数");
232                 input(&m2);
233                 if (ffin)
234                     usescreen_in();
235                 plus(&m1, &m2, &m3);
236                 if (ff)
237                     usefile_out();
238                 putchar('(');
239                 output(&m1);
240                 putchar(')');
241                 putchar('+');
242                 putchar('(');
243                 output(&m2);
244                 putchar(')');
245                 putchar('=');
246                 output(&m3);
247                 ;
248                 printf("
");
249                 if (ff)
250                 {
251                     usescreen_out();
252                     printf("完成!
");
253                 }
254             }
255             else if (i == 2)
256             {
257                 if (ffin)
258                     usefile_in();
259                 if (!ffin)
260                     printf("请输入一个数");
261                 input(&m1);
262                 if (!ffin)
263                     printf("请输入一个数");
264                 input(&m2);
265                 if (ffin)
266                     usescreen_in();
267                 sub(&m1, &m2, &m3);
268                 if (ff)
269                     usefile_out();
270                 putchar('(');
271                 output(&m1);
272                 putchar(')');
273                 putchar('-');
274                 putchar('(');
275                 output(&m2);
276                 putchar(')');
277                 putchar('=');
278                 output(&m3);
279                 ;
280                 printf("
");
281                 if (ff)
282                 {
283                     usescreen_out();
284                     printf("完成!
");
285                 }
286             }
287             else if (i == 3)
288             {
289                 if (ffin)
290                     usefile_in();
291                 if (!ffin)
292                     printf("请输入一个数");
293                 input(&m1);
294                 if (!ffin)
295                     printf("请输入一个数");
296                 input(&m2);
297                 if (ffin)
298                     usescreen_in();
299                 mult(&m1, &m2, &m3);
300                 if (ff)
301                     usefile_out();
302                 putchar('(');
303                 output(&m1);
304                 putchar(')');
305                 printf("×");
306                 putchar('(');
307                 output(&m2);
308                 putchar(')');
309                 putchar('=');
310                 output(&m3);
311                 ;
312                 printf("
");
313                 if (ff)
314                 {
315                     usescreen_out();
316                     printf("完成!
");
317                 }
318             }
319             else if (i == 4)
320             {
321                 if (ffin)
322                     usefile_in();
323                 if (!ffin)
324                     printf("请输入一个数");
325                 input(&m1);
326                 if (!ffin)
327                     printf("请输入一个数");
328                 input(&m2);
329                 if (ffin)
330                     usescreen_in();
331                 printf("保留几位小数:");
332                 scanf("%d", &i);
333                 divi(&m1, &m2, &m3, i);
334                 if (ff)
335                     usefile_out();
336                 putchar('(');
337                 output(&m1);
338                 putchar(')');
339                 printf("÷");
340                 putchar('(');
341                 output(&m2);
342                 putchar(')');
343                 putchar('=');
344                 output(&m3);
345                 ;
346                 printf("
");
347                 if (ff)
348                 {
349                     usescreen_out();
350                     printf("完成!
");
351                 }
352             }
353         }
354         else
355         {
356             printf("错误");
357             continue;
358         }
359         if (ffin)
360         {
361             printf("Done!
");
362             return 0;
363         }
364         printf("*****退出程序请输入:0,继续请输入:1*****
");
365         scanf("%d", &i);
366         if (i == 1)
367             continue;
368         else
369             break;
370     }
371     return 0;
372 }
main.cpp

 

发现自己还不会用github存代码时的表情

原文地址:https://www.cnblogs.com/wawcac-blog/p/10229680.html