版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
设计题目:大整数的四则运算1.功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。课程设计要求:采用模块化程序设计源程序中应有足够的注释必须上机调试通过注重算法运用,优化存储效率与运算效率需提交源程序(含有注释)及相关文件(数据或数据库文件);提交设计报告书。总体结构:数据初始化数据初始化判断运算符号加法正整数非正整数转变为正整数减法转变为加法乘法除法转变为乘法和减法退出流程图:3.概要设计:加法运算利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。如果a和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。减法运算可将减法运算转化为加法运算,只要将被减数的符号改变即可。乘法运算符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。除法运算利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。函数功能:voidinit(inta[],intb[],int*p1,int*p2) 功能说明:读入所要计算的数值,数据初始化intplus(inta[],intb[],intc[],intm,intn)功能说明:两个正整数相加3.voidchange(inta[],intb[],intm,intn)功能说明:当两异号数相加时,改变其符号以符合加法运算intminus(inta[],intb[],intd[],intm,intn)功能说明:两个正整数相减5.voidminusfun(inta[],intb[],intd[],intm,intn) 功能说明:判断两个异号数的相加方式intmulti(inta[],intb[],intc[],intm,intn)功能说明:两个正整数相乘7.voidprint(longc[],intflag)功能说明:打印带符号flag(1为负)的longc[]数组8.intwrite(longa[],intflag)功能说明:将键盘敲入的数字按4位一组放入longa[],且将符号放入flag9.voidmul(longa[],intfirst,intlast,longb[],longc[])功能说明:乘法,a的第last到first位乘以b,答案放到compara(longa[],intfirst,intlast,longb[])功能说明:比较数组a,b大小,firstlast分别为a的最高最低位11.intminusd(longa[],intfirst,intlast,longb[],longc[],intflag)功能说明:a为被减数,firstlast为a最高最低位,b为减数,c为差,flag为符号12.voiddiv(longa[],longb[],longc[],intfa)功能说明:除法,a除以b的值放入c,fa为a符号13.voidmenu()功能说明:打印菜单函数14.voidmain()功能说明:主函数,调用其余函数,计算相应功能的值并输出。5.源程序:#include<iostream.h>#include<math.h>#include<stdio.h>#defineMAX40//可以修改,此时最大运算位数为四十位#defineN10//此处应为最大位数除以4voidinit(inta[],intb[],int*p1,int*p2)//输入{ inti,j; charr,s; for(i=0;i<MAX;i++) { a[i]=0; b[i]=0; } printf("请输入处理的第一个数的值:"); r=getchar(); if(r==45) { a[0]=r; for(i=1;(r=getchar())!='\n';i++) a[i]=r-48; } else { a[1]=r-48; for(i=2;(r=getchar())!='\n';i++) a[i]=r-48; } *p1=i; printf("请输入处理的第二个数的值:"); s=getchar(); if(s==45) { b[0]=s; for(j=1;(s=getchar())!='\n';j++) b[j]=s-48; } else { b[1]=s-48; for(j=2;(s=getchar())!='\n';j++) b[j]=s-48; } *p2=j;}intplus(inta[],intb[],intc[],intm,intn)//加法运算{ intd[MAX]={0},i,j,k; for(i=0;i<MAX;i++)c[i]=0; if(a[1]==0) { for(i=0;i<n;i++)c[i]=b[i]; return(i); } if(b[1]==0) { for(i=0;i<m;i++)c[i]=a[i]; return(i); } for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++) { d[k]=a[i]+b[j]+d[k]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10;} } while(i>0) { d[k]=d[k]+a[i]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10; } k++; i--; } while(j>0) { d[k]=d[k]+b[j]; if(d[k]>9) { d[k+1]++;d[k]=d[k]-10; } k++; j--; } d[0]=a[0]+b[0]; c[0]=d[0]; if(d[k]==0) k--; for(i=1;k>0;i++,k--) c[i]=d[k]; return(i);}voidchange(inta[],intb[],intm,intn)//变号运算{ inti,j; intc[MAX]; if(m<=n&&b[0]==45) { for(i=1;i<m;i++) c[i]=a[i]; for(i=1,j=1;j<n;i++,j++) a[i]=b[j]; for(i=1,j=1;j<n;i++,j++) b[i]=c[j]; for(j=i;j<MAX;j++) b[j]=0; return; } if(m>=n&&a[0]==45) { a[0]=0; b[0]=45; return; }}intminus(inta[],intb[],intd[],intm,intn)//减法运算{ intc[MAX]={0},i,j,k; for(i=0;i<MAX;i++) d[i]=0; for(i=m-1,j=n-1,k=1;i>0&&j>0;i--,j--,k++) { if(c[k]<0||a[i]<b[j]) { c[k]=c[k]+a[i]-b[j]; if(c[k]<0) { c[k]+=10; c[k+1]--; } } elsec[k]=a[i]-b[j]; } while(i>0) { c[k]=c[k]+a[i]; if(c[k]<0) { c[k]+=10; c[k+1]--; } k++;i--; } c[k]=a[i]+c[k]; while(c[k]<=0&&k>0) k--; for(i=1;k>0;i++) d[i]=c[k--]; return(i);}voidminusfun(inta[],intb[],intd[],intm,intn)//判断是否两异号数相加{ inti,j,f=0,g=0; if(a[1]==0) { if(b[0]!=0)printf("-"); for(i=1;i<n;i++) printf("%d",b[i]); printf("\n"); return; } if(b[1]==0) { if(a[0]!=0) printf("-"); for(i=1;i<m;i++) printf("%d",a[i]); printf("\n"); return; } if(m==n) { for(i=1;i<m;i++) { if((a[i]<b[i]&&b[0]==45)||(a[i]>b[i]&&a[0]==45)) g=1; if(a[i]!=b[i])f=1; } if(f==0) { printf("0\n"); return; } if(g==1) { change(a,b,m,n); printf("-"); j=minus(a,b,d,n,m); for(i=1;i<j;i++)printf("%d",d[i]); printf("\n");return; } elseif(a[0]==45&&b[0]==0) { j=minus(b,a,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } else { j=minus(a,b,d,m,n); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n");return; } } if(m>n&&b[0]==45) { j=minus(a,b,d,m,n); for(i=1;i<j;i++)printf("%d",d[i]); printf("\n");return; } if(m<n&&b[0]==45) { change(a,b,m,n); printf("-"); j=minus(a,b,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } if(m>n&&a[0]==45) { change(a,b,m,n); printf("-"); j=minus(a,b,d,m,n); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; } if(m<n&&a[0]==45) { j=minus(b,a,d,n,m); for(i=1;i<j;i++) printf("%d",d[i]); printf("\n"); return; }}intmulti(inta[],intb[],intc[],intm,intn)//正整数乘法运算{ intd[MAX]={0},e[MAX]={0},i,j,k,r,s,x,y; for(i=0;i<MAX;i++) c[i]=0; if(m<=n) { for(i=m-1,s=1;i>0;i--,s++) { for(r=0;r<MAX;r++){d[r]=0;e[r]=0;} for(j=n-1,k=1*s;j>0;j--,k++) { d[k]=a[i]*b[j]+d[k]; if(d[k]>9){d[k+1]=d[k+1]+d[k]/10;d[k]=d[k]%10;} } if(d[k]==0) k--; y=k; for(r=1;k>0;r++,k--) e[r]=d[k]; for(r=1;r<MAX;r++) d[r]=e[r]; if(s==1) x=plus(c,d,e,0,y+1); else x=plus(c,d,e,y,y+1); for(r=0;r<MAX;r++) c[r]=e[r]; } } elseif(m>n) { for(j=n-1,s=1;j>0;j--,s++) { for(r=0;r<MAX;r++) { d[r]=0;e[r]=0; } for(i=m-1,k=1*s;i>0;i--,k++) { d[k]=a[i]*b[j]+d[k]; if(d[k]>9) { d[k+1]=d[k+1]+d[k]/10; d[k]=d[k]%10; } } if(d[k]==0) k--; y=k; for(r=1;k>0;r++,k--) e[r]=d[k]; for(r=1;r<MAX;r++) d[r]=e[r]; if(s==1) x=plus(c,d,e,0,y+1); else x=plus(c,d,e,y,y+1); for(r=0;r<MAX;r++) c[r]=e[r]; } } return(x);}voidprint(longc[],intflag)//输出{ inti; for(i=N-1;i>=0;i--) if(c[i])break;if(flag) printf("-");printf("%4d",c[i--]);for(;i>=0;i--){if(c[i]/1000) printf("%4ld",c[i]);elseif(c[i]/100) printf("0%3ld",c[i]);elseif(c[i]/10) printf("00%2ld",c[i]);else printf("000%1ld",c[i]);}}intwrite(longa[],intflag)//将键盘敲入的数字按4位一组放入longa[],且将符号放入flag{ charnum[N*4]; chartemp; inti,j,k; for(i=0;i<N*4;i++) { num[i]=getchar(); if(num[i]==10) { i--; break; } if(num[i]==45) { flag=(flag+1)%2; i--; } } k=0; for(j=0;j<=i/2;j++) { temp=num[j]; num[j]=num[i-k]; num[i-k]=temp; k++; } k=1; for(j=0;j<=i;j++) switch(k) {case1:a[j/4]+=(long)(num[j]-48); k++;break;case2:a[j/4]+=(long)(num[j]-48)*10; k++;break;case3:a[j/4]+=(long)(num[j]-48)*100; k++;break;case4:a[j/4]+=(long)(num[j]-48)*1000; k=1;break;} returnflag;}voidmul(longa[],intfirst,intlast,longb[],longc[])//乘法{inti,j;intmax_i;longtemp;for(max_i=N-1;max_i>=0;max_i--)if(b[max_i])break;for(i=0;i<=max_i;i++)if(b[i])for(j=first;j<=last;j++) { temp=a[j]*b[i]; c[i+j-first]+=temp%10000; c[i+j-first+1]+=((temp/10000)+(c[i+j-first]/10000)); c[i+j-first]=c[i+j-first]%10000;}}intcompara(longa[],intfirst,intlast,longb[])//比较数组a,b大小{ intflag=2; inti; intk=0; intlen; for(len=N-1;len>=0;len--) if(b[len]) break; if((first-last)>=len) { if((first-last)>len) flag=1; else for(i=len;i>=0;i--) { if(a[first-k]>b[i]) { flag=1; break; }if(a[first-k]<b[i]) {flag=0;break;}k++; } } else flag=0; return flag;}intminusd(longa[],intfirst,intlast,longb[],longc[],intflag){ intnotchange; inti,k=0; intmax; notchange=compara(a,first,last,b); if(notchange) { for(i=last;i<=first;i++) { if(a[i]<b[k]) { a[i]+=10000; a[i+1]--; } c[i]=a[i]-b[k]; k++; } } else { flag=(flag+1)%2; for(max=N-1;max>=0;max--) if(b[max]) break; for(i=0;i<=max;i++) { if(b[i]<a[last+k]) { b[i]+=10000; b[i+1]--; } c[i]=b[i]-a[last+k]; k++; } } returnflag;}voiddiv(longa[],longb[],longc[],intfa)//除法{ longresult[N+1]={0}; intlen_a; intk; inti; printf("\n"); print(a,fa); for(len_a=N-1;len_a>=0;len_a--) if(a[len_a]) break; k=len_a; while(compara(a,len_a,0,b)) { while(!compara(a,len_a,k,b)) k--; c[k]=1; mul(c,k,k,b,result); while(compara(a,len_a,k,result)){ c[k]++; for(i=N-1;i>=0;i--) result[i]=0; mul(c,k,k,b,result); } c[k]--; for(i=N-1;i>=0;i--) result[i]=0; mul(c,k,k,b,result); minusd(a,len_a,k,result,a,0); for(i=N-1;i>=0;i--) result[i]=0; for(len_a=N-1;len_a>=0;len_a--) if(a[len_a]) break; k=len_a; }}voidmenu()//菜单{ printf("==================================大整数计算器=================================="); printf("1.加法 2.减法 3.乘法 4.除法 0.退出\n"); printf("请从1~4中选择:"); return;}voidmain()//主函数{ intflag;intmax; intfa; intfb; longad[N],bd[N],cd[2*N]; inta[MAX]={0},b[MAX]={0},c[MAX]={0},d[MAX]={0}; chars; intm,n,i,j; int*p1,*p2; p1=&m; p2=&n; menu(); s=getchar(); getchar(); while(1) { switch(s) { case'0': return; case'1': printf("格式为:a+b\n"); init(a,b,p1,p2); if(a[1]==0&&b[1]==0) { printf("结果是:a+b=0\n"); break; } if(a[0]==b[0]) { j=plus(a,b,c,m,n); printf("结果是:a+b="); if(c[0]!=0) printf("-"); for(i=1;i<j;i++) printf("%d",c[i]); } else { printf("结果是:a+b="); minusfun(a,b,d,m,n); } printf("\n"); break; case'2': printf("格式为:a-b\n"); init(a,b,p1,p2); if(b[0]==0) b[0]=45; elseif(b[0]==45) b[0]=0; if(a[1]==0&&b[1]==0) { printf("结果是:a-b=0\n"); break; } if(a[0]==b[0]) { j=plus(a,b,c,m,n); printf("结果是:a-b="); if(c[0]!=0) printf("-"); for(i=1;i<j;i++) printf("%d",c[i]); } else { printf("结果是:a-b="); minusfun(a,b,d,m,n); } printf("\n"); break; case'3': init(a,b,p1,p2); if(a[1]==0||b[1]==0) { printf("结果是:0\n"); break; } j=multi(a,b,c,m,n); printf("结果是:"); if((a[0]==45&&b[0]==0)||(b[0]=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论