C语言课程设计——大整数运算

    明人不说暗话,直接上百度网盘链接,输入提取码baxj即可下载。

 该大整数运算系统用于对有符号的位数不超过500位的大整数进行加、减、乘、除四则运算和计算N(0<=N<=10000)的阶乘。
注意事项 :
    1、操作期间,进行四则运算时若大整数为正数请直接省略‘+ ’号。\n");
    2、该大整数运算系统设定处理位数不超过500位的大整数四则运算和计算N(0<=N<=10000)的阶乘,可根据情况调整相关程序参数,进行位数更大的四则运算和N值更大的阶乘计算。
    3、为了保证程序设计流程的简捷性,该系统没有很高的操作容错性能,所以欲执行某项功能,请务必根据提示输入正确的选项值进行操作。
    课程设计中包含程序,程序运行所需文件,设计报告(电子版和打印版),应有尽有,欢迎小伙伴们在本博客的文件中下载使用。

 下面的程序正常运行需要在百度网盘中下在相应输出文件,否则无法正常使用哦。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<ctype.h>
  5 #include <conio.h>
  6 const int N1=40000;
  7 const int N2=510;
  8 
  9 void Display();                                              //显示主菜单
 10 char* Input(char str[]);                                       //输入
 11 void Output(int result[],int j);                             //输出             
 12 int Add(char str1[],char str2[],int result[]);                 //相加 
 13 int Sub(char str1[],char str2[],int result[]);                 //相减 
 14 int Mul(char str1[],char str2[],int result[]);                 //相乘 
 15 int Div(char str1[],char str2[],int result[]);                 //相除 
 16 int Fac(int n,int result[]);                                   //计算阶乘
 17 int Substract(int *bjs,int *js,int Num_len1,int Num_len2);  //计算差的位数
 18 //以上函数返回值为int类型的均是结果的首位非零数字在数组中的下标,小于0表示无结果不输出
 19 int IsBig_num(char str1[],char str2[]);                         //比较 
 20 
 21 int main()
 22 {
 23     int  select,op,n,rs=-1,result[N1];          
 24     //rs表示该数的首位非零数字在数组中的下标,小于0表示无结果不输出 
 25     char str1[N2],str2[N2],*Fir_num,*Sec_num;
 26     while(1)
 27     {
 28         Display();
 29         printf("\n请输入欲执行功能的选项值(0-4): ");
 30         scanf("%d",&select);
 31         switch(select)
 32         {
 33             case 1:
 34                 printf("\n\t\t1 加法运算\n");
 35                 printf("\n\t\t2 减法运算\n");
 36                 printf("\n\t\t3 乘法乘法\n");
 37                 printf("\n\t\t4 除法运算\n");
 38                 printf("\n请输入对应运算的选项值(1-4): ");
 39                 scanf("%d",&op);
 40                 memset(result,0,sizeof(result));
 41                 switch(op)
 42                 {
 43                     case  1:
 44                         printf("\n请输入一个不超过500位的大整数作为 一个加数\n");
 45                         Fir_num=Input(str1);
 46                         printf("\n请输入另一个不超过500位的大整数作为 另一个加数\n");
 47                         Sec_num=Input(str2);
 48                         printf("\n两数之和为\n");
 49                         rs=Add(Fir_num,Sec_num,result);
 50                         break;
 51                     case   2:
 52                         printf("\n请输入一个不超过500位的大整数作为 被减数\n");
 53                         Fir_num=Input(str1);
 54                         printf("\n请输入另一个不超过500位的大整数作为 减数\n");
 55                         Sec_num=Input(str2);
 56                         printf("\n两数之差为\n");
 57                         rs=Sub(Fir_num,Sec_num,result);
 58                         break;
 59                     case   3:
 60                         printf("\n请输入一个不超过500位的大整数作为 一个因数\n");
 61                         Fir_num=Input(str1);
 62                         printf("\n请输入另一个不超过500位的大整数作为 另一个因数\n");
 63                         Sec_num=Input(str2);
 64                         printf("\n两数之积为\n");
 65                         rs=Mul(Fir_num,Sec_num,result);
 66                         break;
 67                     case   4:
 68                         printf("\n请输入一个不超过500位的大整数作为 被除数\n");
 69                         Fir_num=Input(str1);
 70                         printf("\n请输入另一个不超过500位的大整数作为 除数\n");
 71                         Sec_num=Input(str2);
 72                         printf("\n两数之商为\n");
 73                         rs=Div(Fir_num,Sec_num,result); 
 74                         break;
 75                     default:
 76                         printf("\n无效输入\n");
 77                 }
 78                 break;
 79             case 2:
 80                 printf("\n请输入N(0<=N<=10000)\n");
 81                 scanf("%d",&n);
 82                 if(n>10000||n<0)    
 83                 printf("\n错误输入(0<=N<=10000)\n");
 84                 else
 85                 {
 86                     memset(result,0,sizeof(result));
 87                     rs=Fac(n,result);
 88                     printf("\n%d!为\n",n);
 89                 }
 90                 break;
 91             case  3:
 92                 FILE *fp;
 93                 if(NULL==(fp=fopen("系统简介.txt","r")))
 94                     printf("文件打开失败!\n");
 95                 char ch1;
 96                 while(EOF != (ch1=fgetc(fp)))
 97                 {
 98                     printf("%c",ch1);
 99                 }
100                 fclose(fp);
101                 break;
102             case  4:
103                 FILE *fq;
104                 if(NULL==(fq=fopen("开发人员.txt","r")))
105                     printf("文件打开失败!\n");
106                 char ch2;
107                 while(EOF != (ch2=fgetc(fq)))
108                 {
109                     printf("%c",ch2);
110                 }
111                 fclose(fq);
112                 break;
113             case  0:
114                 return 0; 
115             default:
116                 printf("\n无效输入\n");
117         }
118         if(rs >= 0)
119         {
120             Output(result,rs);
121             rs=-1;
122         }
123         printf("\n__________________________________________\n");
124         printf("\n按任意键继续 . . . ");
125         getch();
126         system("cls");
127     }
128 }
129 //主菜单
130 void Display(void)
131 {
132     printf("\n* * * * * * * * * * * * * * * * * * * * *\n");
133     printf("\t      大整数运算系统            \n");
134     printf("* * * * * * * * * * * * * * * * * * * * *\n");
135     printf("\t\t1 四则运算\t \t\n");
136     printf("\t\t2 计算N!     \t\t\n");
137     printf("\t\t3 系统简介  \t\t\n");
138     printf("\t\t4 开发人员 \t\t\n");
139     printf("\t\t0 退出   \t\t\n");
140     printf("* * * * * * * * * * * * * * * * * * * * *\n");
141 }
142 //输入函数 
143 char* Input(char str[])
144 {
145     scanf("%s",str); 
146     char *p=str;
147     while(*p=='0')
148         p++;
149     if(*p=='\0')
150         p--;
151     return p;
152 } 
153 //输出函数 
154 void Output(int result[],int j)
155 {
156     int i;
157     for(i=j;i>=0;i--) 
158         printf("%d",result[i]);
159     printf("\n");
160 }
161 //加法函数 
162 int Add(char str1[],char str2[],int result[])
163 {
164     int  Num_len1,Num_len2,l,i,j;
165     if(str1[0]=='-'||str2[0]=='-')
166     {
167         if(str1[0]=='-'&&str2[0]=='-')
168         {
169             printf("-");
170             str1++;
171             str2++;
172         }
173         else
174         {
175             if(str1[0]=='-')
176             {
177                 if(IsBig_num(str1+1,str2)==0)
178                     return 0;
179                 else    if(IsBig_num(str1+1,str2)<0)
180                     return Sub(str2,str1+1,result);
181                 else  
182                 {
183                     printf("-");
184                     return Sub(str1+1,str2,result);
185                 }
186             }
187             else
188             {
189                 if(IsBig_num(str1,str2+1)==0)
190                     return 0;
191                 else    if(IsBig_num(str1,str2+1)>0)
192                     return Sub(str1,str2+1,result);
193                 else  
194                 {
195                     printf("-");
196                     return Sub(str2+1,str1,result);
197                 }
198             }
199         }
200     }
201     strrev(str1);      
202     strrev(str2);
203     Num_len1=strlen(str1); 
204     Num_len2=strlen(str2);
205     if(Num_len1>=Num_len2) {//按较大数的位数将小数高位用0补齐
206         l=Num_len1;
207         for(i=Num_len2;i<l;i++)
208             str2[i]='0';
209     }
210     else{
211         l=Num_len2;
212         for(i=Num_len1;i<l;i++)
213             str1[i]='0';
214     }        
215     for(i=0;i<l;i++){
216         result[i] += str1[i]-'0'+str2[i]-'0';//一一对应-'0' 
217         if(result[i] > 9)
218         {
219             result[i] %= 10;
220             result[i+1]++;//进位 
221         }
222     }
223     for(j=i;j>=0;j--)
224         if(result[j])//返回结果的非零首位在数组中的下标 
225             return j;
226     return 0;
227 }
228 //减法函数 
229 int Sub(char str1[],char str2[],int result[])
230 {
231     int i,Num_len1,Num_len2;
232     char *temp;
233     if(str1[0]=='-'||str2[0]=='-')
234     {
235         if(str1[0]=='-'&&str2[0]=='-')
236         {
237             if(IsBig_num(str1+1,str2+1)==0)
238                 return 0;
239             else    if(IsBig_num(str1+1,str2+1)<0)
240             {
241                 temp=str2++;
242                 str2=str1++;
243                 str1=temp;
244             }
245             else  
246             {
247                 printf("-");
248                 str1++;
249                 str2++;
250             }
251         }
252         else
253         {
254             if(str1[0]=='-')
255             {
256                 printf("-");
257                 return Add(str1+1,str2,result);
258             }
259             else
260                 return Add(str1,str2+1,result);
261         }
262     }
263     else
264     {
265         if(IsBig_num(str1,str2)==0)
266             return 0;
267         else    if(IsBig_num(str1,str2)<0)  
268         {
269             printf("-");
270             temp=str2;
271             str2=str1;
272             str1=temp;
273         }
274     }
275     Num_len1=strlen(str1);
276     Num_len2=strlen(str2);
277     strrev(str1);
278     strrev(str2);
279     if(Num_len1>Num_len2){//高位补零
280         for(i=Num_len2;i<Num_len1;i++) 
281             str2[i]='0';
282     }
283     for(i=0;i<Num_len1;i++) {
284         result[i] += (str1[i]-'0') - (str2[i]-'0');
285         if(result[i] < 0){
286             result[i] += 10;
287             result[i+1]--;
288         }
289     }
290     for(i=Num_len1-1;i>=0;i--) 
291         if(result[i])
292             return i;
293     return 0;
294 }
295 //乘法函数 
296 int Mul(char str1[],char str2[],int result[])
297 {
298     int  i,j,Num_len1,Num_len2;
299     if(str1[0]=='-'||str2[0]=='-')
300     {
301         if(str1[0]=='-'&&str2[0]=='-')
302         {
303             str1++;
304             str2++;
305         }
306         else
307         {
308             printf("-");
309             if(str1[0]=='-')
310                 str1++;
311             if(str2[0]=='-')
312                 str2++;
313         }
314     }
315     Num_len1=strlen(str1);
316     Num_len2=strlen(str2);
317     strrev(str1);
318     strrev(str2);
319     //乘积 
320     for(i=0;i<Num_len1;i++) 
321         for(j=0;j<Num_len2;j++)
322             result[i+j] += (str1[i]-'0')*(str2[j]-'0');
323     //处理进位
324     for(i=0;i<N2*2;i++) {
325         if(result[i] > 9)//先计算进位,否则前面的值先改变,不能进位 
326         {
327             result[i+1] += result[i] / 10 ;
328             result[i]   %= 10;
329         }
330     } 
331      //输出 
332     for(i=2*N2;i>=0;i--) 
333         if(result[i])
334              return i; 
335     return 0;
336 }
337 //除法函数 
338 int Div(char str1[],char str2[],int result[])
339 {
340     int  a[N2],b[N2];
341     int i,j,k,Num_len1,Num_len2,n;
342     if(str1[0]=='-'||str2[0]=='-')
343     {
344         if(str1[0]=='-'&&str2[0]=='-')
345         {
346             str1++;
347             str2++;
348         }
349         else
350         {
351             printf("-");
352             if(str1[0]=='-')
353                 str1++;
354             if(str2[0]=='-')
355                 str2++;
356         }
357     }
358     Num_len1=strlen(str1);
359     Num_len2=strlen(str2);
360     if(Num_len2==1 && str2[0]=='0'){
361         printf("错误输入(除数不能为零)\n");
362         return -1;
363     }
364     memset(a,0,sizeof(a));//数组初始化 
365     memset(b,0,sizeof(b));
366     for(j=0,i=Num_len1-1;i>=0;i--)
367         a[j++]=str1[i]-'0';
368     for(j=0,i=Num_len2-1;i>=0;i--)
369         b[j++]=str2[i]-'0';
370     
371     Num_len1=Substract(a,b,Num_len1,Num_len2);
372     if(Num_len1<=0){
373         if(Num_len1<0) {
374             return 0;//第一次减时不够减为
375         }
376         else {
377             result[0]=1;//正好够减商为
378             return 0;
379         } 
380     }
381     result[0]++;
382     n=Num_len1-Num_len2; 
383     if(n<0) { 
384         result[0]=1; //减过一次不够减商为
385         return 0 ; 
386     } 
387     else if(n>0) {
388         for(i=Num_len1-1;i>=0;i--) {//将减数逆置 
389             if(i>=n)//倒着存储 当i大于等于n时,将i的位置存i-n的值,否则存0 
390             b[i]=b[i-n];
391             else
392             b[i]=0;
393         }
394     }
395     Num_len2=Num_len1;
396     for(j=0;j<=n;j++) {
397         while( (k=Substract(a,b+j,Num_len1,Num_len2-j)) >= 0)//传递对应的参数  
398         {
399             Num_len1=k;//更新长度 
400             result[n-j]++;//n-j是对应的位权 
401         }
402     }
403     for(i=0;i<N2;i++){
404         if(result[i]>=10) 
405             result[i+1] += result[i]/10;//先进位再处理本位 
406         result[i] %= 10; 
407     }
408     for(i=N2;i>=0;i--)
409         if(result[i])
410             return i; 
411     return 0;
412 }
413 //计算差的长度函数 
414 int Substract(int *bjs,int *js,int Num_len1,int Num_len2)
415 {
416      int i;
417      if(Num_len1<Num_len2)
418      return -1;
419      bool bLarge=false;//长度相等的小于 
420      if(Num_len1==Num_len2) {
421          for(i=Num_len1-1;i>=0;i--) {
422              if(bjs[i]>js[i])
423                  bLarge=true;
424              else if(bjs[i]<js[i]) {
425                  if(!bLarge)
426                      return -1;
427              }
428           }
429      }
430     for(i=0;i<Num_len1;i++) {
431          bjs[i] -= js[i];
432          if(bjs[i]<0) {
433              bjs[i] += 10;
434              bjs[i+1]--;
435          }
436     } 
437     for(i=Num_len1-1;i>=0;i--)
438           if(bjs[i])
439           return i+1;//返回长度加1 
440     return 0;
441 }
442  //计算阶乘函数 
443 int Fac(int n,int result[])
444 {
445      int i,j,k,jw,t;
446     result[0]=1;
447     for(k=1, i=1;i<=n;i++){
448         for(jw=0, j=0;j<k;j++){
449             t         = result[j]*i + jw;
450             result[j] = t%10;
451             jw        = t/10;    
452         } 
453         while(jw)//直到上一个阶乘结果处理完后,将结果数组扩大,存进进位数即可
454         {
455             result[++k -1]= jw%10;
456             jw /= 10;
457         } 
458     }
459     return k-1;
460 }
461 //比较函数 
462 int IsBig_num(char str1[],char str2[])
463 {
464     int Num_len1,Num_len2;
465     Num_len1=strlen(str1);
466     Num_len2=strlen(str2);
467     if(Num_len1<Num_len2)
468         return -1;
469     else
470     {
471         if(Num_len1==Num_len2)
472         {
473             if(strcmp(str1,str2)==0)
474                 return 0;
475             else
476             {
477                 if(strcmp(str1,str2)<0)
478                     return -1;
479                 else
480                     return 1; 
481             }
482         }
483         else
484             return 1;
485     }
486 } 

 

posted @ 2018-01-24 23:10  Reqaw  阅读(1639)  评论(0编辑  收藏  举报