




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 设计题目: 大整数的四则运算 1. 功能简介:编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算结构。 课程设计要求:采用模块化程序设计 源程序中应有足够的注释 必须上机调试通过 注重算法运用,优化存储效率与运算效率 需提交源程序(含有注释)及相关文件(数据或数据库文件); 提交设计报告书。2. 总体结构: 数据初始化判断运算符号加法正整数非正整数转变为正整数减法转变为加法乘法除法转变为乘法和减法退出流程图:3 .概要设计:1) 加法运算 利用两个整形数组分别存放两个数a和b的每一位的数值,最低位存放符号。如果a和b同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10,然
2、后反序将计算后的各个位的数值保存在一个数组c并输出,如果a和b都是负数则在前面要输出负号,函数的返回值为c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如果要借位则本位加10再相减,高一位要减1,然后反序将计算后的各个位的数值保存在一个数组c并输出,在前面要输出相应的符号位。2) 减法运算 可将减法运算转化为加法运算,只要将被减数的符号改变即可。3) 乘法运算 符号存放在最低位,将其中一个数a的每一位分别乘以另一个数b的每一位,并将结果保存在数组c中,然后重复计算a的下一位跟b的每一位的乘积,把上一次计算保存在c的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出
3、符号和相应的计算结果。4) 除法运算 利用乘法和减法,将除数分别乘以1到9,直到其值大于等于被除数的对应的数,然后被除数对应的数减去其乘积,保存在一个数组中,下一次循环把它归到被除数中继续做除法运算,最后得到余数并输出。4. 函数功能:1. void init(int a,int b,int *p1,int *p2)2. 功能说明:读入所要计算的数值,数据初始化3. int plus(int a,int b,int c,int m,int n) 4. 功能说明:两个正整数相加3. void change(int a,int b,int m,int n) 功能说明:当两异号数相加时,改变其符号以
4、符合加法运算5. int minus(int a,int b,int d,int m,int n) 6. 功能说明:两个正整数相减5. void minusfun(int a,int b,int d,int m,int n) 功能说明:判断两个异号数的相加方式7. int multi(int a,int b,int c,int m,int n) 8. 功能说明:两个正整数相乘7. void print(long c,int flag) 功能说明:打印带符号flag(1为负)的long c数组8. int write(long a,int flag) 功能说明:将键盘敲入的数字按4位一组放入lo
5、ng a,且将符号放入flag9. void mul(long a,int first,int last,long b,long c) 功能说明:乘法,a的第last到first位乘以b,答案放到c10. int compara(long a,int first,int last,long b) 功能说明:比较数组a,b大小,first last分别为a的最高最低位11. int minusd(long a,int first,int last,long b,long c,int flag) 功能说明:a为被减数,first last为a最高最低位,b为减数,c为差,flag为符号12. vo
6、id div(long a,long b,long c,int fa) 功能说明:除法,a除以b的值放入c,fa为a符号13. void menu() 功能说明:打印菜单函数14. void main() 功能说明:主函数,调用其余函数,计算相应功能的值并输出。5.源程序:#include<iostream.h>#include<math.h>#include<stdio.h>#define MAX 40 /可以修改,此时最大运算位数为四十位#define N 10 /此处应为最大位数除以4void init(int a,int b,int *p1,int
7、*p2) /输入int i,j;char r,s;for(i=0;i<MAX;i+)ai=0;bi=0;printf("请输入处理的第一个数的值:");r=getchar();if(r=45) a0=r;for(i=1;(r=getchar()!='n'i+)ai=r-48;else a1=r-48;for(i=2;(r=getchar()!='n'i+)ai=r-48;*p1=i;printf("请输入处理的第二个数的值:");s=getchar();if(s=45) b0=s;for(j=1;(s=getchar
8、()!='n'j+)bj=s-48;else b1=s-48;for(j=2;(s=getchar()!='n'j+)bj=s-48;*p2=j;int plus(int a,int b,int c,int m,int n) /加法运算int dMAX=0,i,j,k;for(i=0;i<MAX;i+) ci=0;if(a1=0) for(i=0;i<n;i+) ci=bi;return(i);if(b1=0) for(i=0;i<m;i+) ci=ai;return(i);for(i=m-1,j=n-1,k=1;i>0&&
9、;j>0;i-,j-,k+)dk=ai+bj+dk;if(dk>9)dk+1+;dk=dk-10;while(i>0) dk=dk+ai;if(dk>9) dk+1+;dk=dk-10;k+;i-;while(j>0) dk=dk+bj;if(dk>9) dk+1+;dk=dk-10;k+;j-;d0=a0+b0;c0=d0;if(dk=0) k-;for(i=1;k>0;i+,k-)ci=dk;return(i);void change(int a,int b,int m,int n) /变号运算int i,j;int cMAX;if(m<=n
10、&&b0=45)for(i=1;i<m;i+)ci=ai;for(i=1,j=1;j<n;i+,j+)ai=bj;for(i=1,j=1;j<n;i+,j+)bi=cj;for(j=i;j<MAX;j+)bj=0;return;if(m>=n&&a0=45)a0=0;b0=45;return;int minus(int a,int b,int d,int m,int n) /减法运算int cMAX=0,i,j,k;for(i=0;i<MAX;i+)di=0;for(i=m-1,j=n-1,k=1;i>0&&am
11、p;j>0;i-,j-,k+)if(ck<0|ai<bj)ck=ck+ai-bj;if(ck<0)ck+=10;ck+1-;else ck=ai-bj;while(i>0) ck=ck+ai;if(ck<0) ck+=10;ck+1-;k+;i-;ck=ai+ck;while(ck<=0&&k>0) k-;for(i=1;k>0;i+) di=ck-;return(i);void minusfun(int a,int b,int d,int m,int n) /判断是否两异号数相加int i,j,f=0,g=0;if(a1=
12、0) if(b0!=0) printf("-");for(i=1;i<n;i+)printf("%d",bi);printf("n"); return;if(b1=0) if(a0!=0)printf("-");for(i=1;i<m;i+)printf("%d",ai);printf("n");return;if(m=n)for(i=1;i<m;i+)if(ai<bi&&b0=45)|(ai>bi&&a0=45)
13、g=1;if(ai!=bi) f=1;if(f=0)printf("0n");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",di);printf("n");return;else if(a0=45&&b0=0)j=minus(b,a,d,n,m);for(i=1;i<j;i+)printf("%d",di);printf("n&
14、quot;);return;elsej=minus(a,b,d,m,n); for(i=1;i<j;i+)printf("%d",di);printf("n");return;if(m>n&&b0=45)j=minus(a,b,d,m,n); for(i=1;i<j;i+) printf("%d",di);printf("n");return;if(m<n&&b0=45)change(a,b,m,n);printf("-"); j=minu
15、s(a,b,d,n,m);for(i=1;i<j;i+) printf("%d",di);printf("n");return;if(m>n&&a0=45)change(a,b,m,n); printf("-");j=minus(a,b,d,m,n);for(i=1;i<j;i+) printf("%d",di);printf("n");return;if(m<n&&a0=45)j=minus(b,a,d,n,m); for(i=1;i&l
16、t;j;i+) printf("%d",di);printf("n");return;int multi(int a,int b,int c,int m,int n) /正整数乘法运算int dMAX=0,eMAX=0,i,j,k,r,s,x,y;for(i=0;i<MAX;i+)ci=0;if(m<=n)for(i=m-1,s=1;i>0;i-,s+)for(r=0;r<MAX;r+)dr=0;er=0;for(j=n-1,k=1*s;j>0;j-,k+)dk=ai*bj+dk;if(dk>9) dk+1=dk+1+
17、dk/10;dk=dk%10;if(dk=0)k-;y=k;for(r=1;k>0;r+,k-)er=dk;for(r=1;r<MAX;r+)dr=er;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+) cr=er;else if(m>n)for(j=n-1,s=1;j>0;j-,s+)for(r=0;r<MAX;r+)dr=0;er=0;for(i=m-1,k=1*s;i>0;i-,k+)dk=ai*bj+dk;if(dk>9) dk+1=dk+1+dk
18、/10;dk=dk%10;if(dk=0) k-;y=k;for(r=1;k>0;r+,k-)er=dk;for(r=1;r<MAX;r+)dr=er;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+)cr=er;return(x);void print(long c,int flag) /输出int i;for(i=N-1;i>=0;i-) if(ci) break; if(flag) printf("-"); printf("%4d",c
19、i-); for(;i>=0;i-) if(ci/1000) printf(" %4ld",ci); else if(ci/100) printf(" 0%3ld",ci); else if(ci/10) printf(" 00%2ld",ci); else printf(" 000%1ld",ci); int write(long a,int flag) /将键盘敲入的数字按4位一组放入long a,且将符号放入flagchar numN*4; char temp;int i,j,k;for(i=0;i&l
20、t;N*4;i+) numi=getchar();if(numi=10) i-;break;if(numi=45)flag=(flag+1)%2; i-;k=0;for(j=0;j<=i/2;j+) temp=numj;numj=numi-k;numi-k=temp;k+;k=1;for(j=0;j<=i;j+) switch(k)case 1:aj/4+=(long)(numj-48); k+; break;case 2:aj/4+=(long)(numj-48)*10; k+; break;case 3:aj/4+=(long)(numj-48)*100; k+; break;
21、case 4:aj/4+=(long)(numj-48)*1000; k=1; break; return flag;void mul(long a,int first,int last,long b,long c) /乘法 int i,j; int max_i; long temp; for(max_i=N-1;max_i>=0;max_i-) if(bmax_i) break; for(i=0;i<=max_i;i+) if(bi) for(j=first;j<=last;j+) temp=aj*bi; ci+j-first+=temp%10000; ci+j-first
22、+1+=(temp/10000)+(ci+j-first/10000); ci+j-first=ci+j-first%10000; int compara(long a,int first,int last,long b) /比较数组a,b大小int flag=2;int i;int k=0;int len; for(len=N-1;len>=0;len-) if(blen)break;if(first-last)>=len)if(first-last)>len) flag=1;elsefor(i=len;i>=0;i-)if(afirst-k>bi)flag=1
23、;break; if(afirst-k<bi) flag=0; break; k+;elseflag=0;return flag;int minusd(long a,int first,int last,long b,long c,int flag)int notchange;int i,k=0;int max; notchange=compara(a,first,last,b); if(notchange) for(i=last;i<=first;i+)if(ai<bk) ai+=10000;ai+1-;ci=ai-bk; k+;elseflag=(flag+1)%2; f
24、or(max=N-1;max>=0;max-)if(bmax)break;for(i=0;i<=max;i+) if(bi<alast+k)bi+=10000;bi+1-;ci=bi-alast+k;k+;return flag;void div(long a,long b,long c,int fa) /除法long resultN+1=0; int len_a;int k;int i;printf("n");print(a,fa); for(len_a=N-1;len_a>=0;len_a-) if(alen_a)break;k=len_a;wh
25、ile(compara(a,len_a,0,b) while(!compara(a,len_a,k,b) k-;ck=1;mul(c,k,k,b,result); while(compara(a,len_a,k,result) ck+;for(i=N-1;i>=0;i-) resulti=0;mul(c,k,k,b,result);ck-; for(i=N-1;i>=0;i-)resulti=0;mul(c,k,k,b,result); minusd(a,len_a,k,result,a,0); for(i=N-1;i>=0;i-) resulti=0;for(len_a=N
26、-1;len_a>=0;len_a-) if(alen_a)break;k=len_a; void menu() /菜单printf("=大整数计算器=");printf("1.加法2.减法3.乘法4.除法0.退出n");printf("请从14中选择:");return;void main() /主函数int flag; int max; int fa; int fb; long adN,bdN,cd2*N;int aMAX=0,bMAX=0,cMAX=0,dMAX=0;char s;int m,n,i,j;int *p1,*
27、p2;p1=&m;p2=&n;menu();s=getchar();getchar();while(1)switch(s)case '0':return;case '1':printf("格式为:a+bn");init(a,b,p1,p2); if(a1=0&&b1=0)printf("结果是:a+b=0n"); break;if(a0=b0)j=plus(a,b,c,m,n); printf("结果是:a+b=");if(c0!=0)printf("-&quo
28、t;);for(i=1;i<j;i+) printf("%d",ci);else printf("结果是:a+b=");minusfun(a,b,d,m,n);printf("n");break;case '2': printf("格式为:a-bn"); init(a,b,p1,p2); if(b0=0)b0=45;else if(b0=45)b0=0;if(a1=0&&b1=0) printf("结果是:a-b=0n"); break;if(a0=b0)j
29、=plus(a,b,c,m,n); printf("结果是:a-b=");if(c0!=0) printf("-");for(i=1;i<j;i+)printf("%d",ci);elseprintf("结果是:a-b=");minusfun(a,b,d,m,n);printf("n"); break;case '3': init(a,b,p1,p2); if(a1=0|b1=0) printf("结果是:0n");break;j=multi(a,b,c,m,n); printf("结果是:");if(a0=45&&b0=0)|(b0=45&&a0=0)printf("-");for(i=1;i<j;i+) printf("%d",ci);printf("n");break;case '4': flag=fa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三起科学六年级上册第三单元第二课铁钉生锈了教学设计
- 8 美丽文字 民族瑰宝(教学设计)2023-2024学年统编版道德与法治五年级上册
- 真理诞生于一百个问号之后(大姚教学范式第二课时教学设计)
- 2024年五年级语文下册 第一单元 语文园地教学实录 新人教版
- 20 我们家的男子汉(教学设计)-2023-2024学年统编版语文四年级下册
- 专题一:古代中国的政治制度课件
- 2023三年级数学上册 1 时、分、秒第1课时 秒的认识教学实录 新人教版
- 2024年五年级语文上册 第七单元 22 四季之美配套教学实录 新人教版
- 5 小小的船 教学设计-2024-2025学年统编版语文一年级上册
- 2024-2025学年新教材高中物理 第4章 万有引力定律及航天 第3节 人类对太空的不懈探索教学实录1 鲁科版必修第二册
- 小沈阳《四大才子》欢乐喜剧人台词
- 学生个体差异
- 复合材料力学课件
- 合理使用抗菌药物控制细菌耐药增长课件
- 机修工基础培训课件
- 交通安全设施作业指导书
- 陕旅版四年级英语下册最新教案及各单元教材分析
- 万科培训物业管理常识及万科物业简介(课件)
- 优秀员工荣誉证书模板
- 《鹿角和鹿腿》 完整版课件
- 医院实习生岗前培训课件
评论
0/150
提交评论