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 }