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 } 
  • 相关阅读:
    BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
    BZOJ3417[Poi2013]Tales of seafaring——BFS
    BZOJ3750[POI2015]Pieczęć——链表
    bzoj 3594 方伯伯的玉米田
    Cocos2dx学习之SimpleGame
    新旧版本的quick-x项目移植
    cocos2dx 2.2.1 下面创建新项目测试运行
    VS2012下面编译Cocos2dx的HelloLua项目时报错>>> 项目文件"" 已被重命名或已不在解决方案中
    cocos2dx-lua or quick 2dx 中的图片资源加密
    关于对quick-2dx项目中的Lua代码的加密
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8344014.html
Copyright © 2011-2022 走看看