大整数的四则运算 高质量C语言程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

设计题目:大整数的四则运算1.功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。课程设计要求:采用模块化程序设计源程序中应有足够的注释必须上机调试通过注重算法运用,优化存储效率与运算效率需提交源程序(含有注释)及相关文件(数据或数据库文件);提交设计报告书。2.总体结构:流程图:数据初始化判断运算符号加法正整数非正整数转变为正整数减法转变为加法乘法除法转变为乘法和减法退出3.概要设计:1)加法运算利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。如果a和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。2)减法运算可将减法运算转化为加法运算,只要将被减数的符号改变即可。3)乘法运算符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。4)除法运算利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。4.函数功能:1.voidinit(inta[],intb[],int*p1,int*p2)2.功能说明:读入所要计算的数值,数据初始化3.intplus(inta[],intb[],intc[],intm,intn)4.功能说明:两个正整数相加3.voidchange(inta[],intb[],intm,intn)功能说明:当两异号数相加时,改变其符号以符合加法运算5.intminus(inta[],intb[],intd[],intm,intn)6.功能说明:两个正整数相减5.voidminusfun(inta[],intb[],intd[],intm,intn)功能说明:判断两个异号数的相加方式7.intmulti(inta[],intb[],intc[],intm,intn)8.功能说明:两个正整数相乘7.voidprint(longc[],intflag)功能说明:打印带符号flag(1为负)的longc[]数组8.intwrite(longa[],intflag)功能说明:将键盘敲入的数字按4位一组放入longa[],且将符号放入flag9.voidmul(longa[],intfirst,intlast,longb[],longc[])功能说明:乘法,a的第last到first位乘以b,答案放到c10.intcompara(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.源程序:#includeiostream.h#includemath.h#includestdio.h#defineMAX40//可以修改,此时最大运算位数为四十位#defineN10//此处应为最大位数除以4voidinit(inta[],intb[],int*p1,int*p2)//输入{inti,j;charr,s;for(i=0;iMAX;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;iMAX;i++)c[i]=0;if(a[1]==0){for(i=0;in;i++)c[i]=b[i];return(i);}if(b[1]==0){for(i=0;im;i++)c[i]=a[i];return(i);}for(i=m-1,j=n-1,k=1;i0&&j0;i--,j--,k++){d[k]=a[i]+b[j]+d[k];if(d[k]9){d[k+1]++;d[k]=d[k]-10;}}while(i0){d[k]=d[k]+a[i];if(d[k]9){d[k+1]++;d[k]=d[k]-10;}k++;i--;}while(j0){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;k0;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;im;i++)c[i]=a[i];for(i=1,j=1;jn;i++,j++)a[i]=b[j];for(i=1,j=1;jn;i++,j++)b[i]=c[j];for(j=i;jMAX;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;iMAX;i++)d[i]=0;for(i=m-1,j=n-1,k=1;i0&&j0;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(i0){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&&k0)k--;for(i=1;k0;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;in;i++)printf(%d,b[i]);printf(\n);return;}if(b[1]==0){if(a[0]!=0)printf(-);for(i=1;im;i++)printf(%d,a[i]);printf(\n);return;}if(m==n){for(i=1;im;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;ij;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;ij;i++)printf(%d,d[i]);printf(\n);return;}else{j=minus(a,b,d,m,n);for(i=1;ij;i++)printf(%d,d[i]);printf(\n);return;}}if(mn&&b[0]==45){j=minus(a,b,d,m,n);for(i=1;ij;i++)printf(%d,d[i]);printf(\n);return;}if(mn&&b[0]==45){change(a,b,m,n);printf(-);j=minus(a,b,d,n,m);for(i=1;ij;i++)printf(%d,d[i]);printf(\n);return;}if(mn&&a[0]==45){change(a,b,m,n);printf(-);j=minus(a,b,d,m,n);for(i=1;ij;i++)printf(%d,d[i]);printf(\n);return;}if(mn&&a[0]==45){j=minus(b,a,d,n,m);for(i=1;ij;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;iMAX;i++)c[i]=0;if(m=n){for(i=m-1,s=1;i0;i--,s++){for(r=0;rMAX;r++){d[r]=0;e[r]=0;}for(j=n-1,k=1*s;j0;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;k0;r++,k--)e[r]=d[k];for(r=1;rMAX;r++)d[r]=e[r];if(s==1)x=plus(c,d,e,0,y+1);elsex=plus(c,d,e,y,y+1);for(r=0;rMAX;r++)c[r]=e[r];}}elseif(mn){for(j=n-1,s=1;j0;j--,s++){for(r=0;rMAX;r++){d[r]=0;e[r]=0;}for(i=m-1,k=1*s;i0;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;k0;r++,k--)e[r]=d[k];for(r=1;rMAX;r++)d[r]=e[r];if(s==1)x=plus(c,d,e,0,y+1);elsex=plus(c,d,e,y,y+1)

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功