zoukankan      html  css  js  c++  java
  • C语言课程设计大整数运算

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

     该大整数运算系统用于对有符号的位数不超过500位的大整数进行加、减、乘、除四则运算和计算N(0<=N<=10000)的阶乘。
    注意事项 :
        1、操作期间,进行四则运算时若大整数为正数请直接省略‘+ ’号。 ");
        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("
    请输入欲执行功能的选项值(0-4): ");
     30         scanf("%d",&select);
     31         switch(select)
     32         {
     33             case 1:
     34                 printf("
    		1 加法运算
    ");
     35                 printf("
    		2 减法运算
    ");
     36                 printf("
    		3 乘法乘法
    ");
     37                 printf("
    		4 除法运算
    ");
     38                 printf("
    请输入对应运算的选项值(1-4): ");
     39                 scanf("%d",&op);
     40                 memset(result,0,sizeof(result));
     41                 switch(op)
     42                 {
     43                     case  1:
     44                         printf("
    请输入一个不超过500位的大整数作为 一个加数
    ");
     45                         Fir_num=Input(str1);
     46                         printf("
    请输入另一个不超过500位的大整数作为 另一个加数
    ");
     47                         Sec_num=Input(str2);
     48                         printf("
    两数之和为
    ");
     49                         rs=Add(Fir_num,Sec_num,result);
     50                         break;
     51                     case   2:
     52                         printf("
    请输入一个不超过500位的大整数作为 被减数
    ");
     53                         Fir_num=Input(str1);
     54                         printf("
    请输入另一个不超过500位的大整数作为 减数
    ");
     55                         Sec_num=Input(str2);
     56                         printf("
    两数之差为
    ");
     57                         rs=Sub(Fir_num,Sec_num,result);
     58                         break;
     59                     case   3:
     60                         printf("
    请输入一个不超过500位的大整数作为 一个因数
    ");
     61                         Fir_num=Input(str1);
     62                         printf("
    请输入另一个不超过500位的大整数作为 另一个因数
    ");
     63                         Sec_num=Input(str2);
     64                         printf("
    两数之积为
    ");
     65                         rs=Mul(Fir_num,Sec_num,result);
     66                         break;
     67                     case   4:
     68                         printf("
    请输入一个不超过500位的大整数作为 被除数
    ");
     69                         Fir_num=Input(str1);
     70                         printf("
    请输入另一个不超过500位的大整数作为 除数
    ");
     71                         Sec_num=Input(str2);
     72                         printf("
    两数之商为
    ");
     73                         rs=Div(Fir_num,Sec_num,result); 
     74                         break;
     75                     default:
     76                         printf("
    无效输入
    ");
     77                 }
     78                 break;
     79             case 2:
     80                 printf("
    请输入N(0<=N<=10000)
    ");
     81                 scanf("%d",&n);
     82                 if(n>10000||n<0)    
     83                 printf("
    错误输入(0<=N<=10000)
    ");
     84                 else
     85                 {
     86                     memset(result,0,sizeof(result));
     87                     rs=Fac(n,result);
     88                     printf("
    %d!为
    ",n);
     89                 }
     90                 break;
     91             case  3:
     92                 FILE *fp;
     93                 if(NULL==(fp=fopen("系统简介.txt","r")))
     94                     printf("文件打开失败!
    ");
     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("文件打开失败!
    ");
    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("
    无效输入
    ");
    117         }
    118         if(rs >= 0)
    119         {
    120             Output(result,rs);
    121             rs=-1;
    122         }
    123         printf("
    __________________________________________
    ");
    124         printf("
    按任意键继续 . . . ");
    125         getch();
    126         system("cls");
    127     }
    128 }
    129 //主菜单
    130 void Display(void)
    131 {
    132     printf("
    * * * * * * * * * * * * * * * * * * * * *
    ");
    133     printf("	      大整数运算系统            
    ");
    134     printf("* * * * * * * * * * * * * * * * * * * * *
    ");
    135     printf("		1 四则运算	 	
    ");
    136     printf("		2 计算N!     		
    ");
    137     printf("		3 系统简介  		
    ");
    138     printf("		4 开发人员 		
    ");
    139     printf("		0 退出   		
    ");
    140     printf("* * * * * * * * * * * * * * * * * * * * *
    ");
    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=='')
    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("
    ");
    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("错误输入(除数不能为零)
    ");
    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 } 
  • 相关阅读:
    飞入飞出效果
    【JSOI 2008】星球大战 Starwar
    POJ 1094 Sorting It All Out
    POJ 2728 Desert King
    【ZJOI 2008】树的统计 Count
    【SCOI 2009】生日快乐
    POJ 3580 SuperMemo
    POJ 1639 Picnic Planning
    POJ 2976 Dropping Tests
    SPOJ QTREE
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8344014.html
Copyright © 2011-2022 走看看