




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 功能简介: 编写出实现大整数之间相加,相减,相乘,相除的程序,并输出计算 结构。课程设计要求: 采用模块化程序设计源程序中应有足够的注释必须上机调试通过注重算法运用,优化存储效率与运算效率需提交源程序(含有注释)及相关文件(数据或数据库文件); 提交设计报告书。2. 总体结构:数据初判断运算符 号加法减法乘法除法退出正整数非正整转变为转变为转变为流程图:3 概要设计:1) 加法运算利用两个整形数组分别存放两个数 a 和 b 的每一位的数值,最低位存放符号。如果 a 和 b 同号,从最低为开始计算,如果有进位则保存在高一位,本为则减10 ,然后反序将计算后的各个位的数值保存在一个数组c并输
2、出,如果a和b都是负数则在前面要输出负号,函数的返回值为 c的位数。如果a和b异号,也即两个正整数相减,从最低位开始相减,如 果要借位则本位加 10 再相减,高一位要减 1,然后反序将计算后的各个位的数值保存在一 个数组 c 并输出,在前面要输出相应的符号位。2) 减法运算可将减法运算转化为加法运算,只要将被减数的符号改变即可。3) 乘法运算符号存放在最低位,将其中一个数 a 的每一位分别乘以另一个数 b 的每一位,并将结 果保存在数组c中,然后重复计算 a的下一位跟b的每一位的乘积,把上一次计算保存在c的值加上本次计算后的值,并保存在c自身中,直到a的最高位,最后输出符号和相应的计算结果。4
3、) 除法运算利用乘法和减法,将除数分别乘以 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) 功能说明:当两异号数相加时,改变其符号以符合加法运算5.
4、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位一组放入long a,且将符号放
5、入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. void
6、div(long a,long b,long c,int fa)功能说明:除法 ,a 除以 b 的值放入 c,fa 为 a 符号13. void menu()功能说明:打印菜单函数14. void main()功能说明:主函数,调用其余函数,计算相应功能的值并输出。5. 源程序:#include #include #include#define MAX 40/可以修改,此时最大运算位数为四十位#define N 10/此处应为最大位数除以4void init(int a,int b,int *p1,int *p2)/输入int i,j;char r,s; for(i=0;iMAX;i+)ai=
7、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()!=n;j+) bj=s-48;elseb1=s-48;for(j=2;(s=getchar()!=n;j+) bj=s-48;*p2=j;int plus
8、(int a,int b,int c,int m,int n)int dMAX=0,i,j,k;for(i=0;iMAX;i+) ci=0;if(a1=0)for(i=0;in;i+) ci=bi;return(i);if(b1=0)for(i=0;i0&j0;i-,j-,k+)dk=ai+bj+dk;if(dk9) dk+1+;dk=dk-10;while(i0)dk=dk+ai;if(dk9) dk+1+;dk=dk-10;k+;/变号运算/减法运算i-;while(j0) dk=dk+bj; if(dk9) dk+1+;dk=dk-10;k+;j-;d0=a0+b0;c0=d0;if(d
9、k=0)k-;for(i=1;k0;i+,k-)ci=dk;return(i);void change(int a,int b,int m,int n)int i,j;int cMAX;if(m=n&b0=45) for(i=1;im;i+) ci=ai;for(i=1,j=1;jn;i+,j+) ai=bj;for(i=1,j=1;jn;i+,j+) bi=cj;for(j=i;j=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;i0&j0;i-,j-,k+)
10、 if(ck0|aibj)ck=ck+ai-bj;if(ck0)ck=ck+ai;if(ck0)ck+=10;ck+1-;k+;i-;ck=ai+ck;while(ck0)k-;for(i=1;k0;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=0)if(b0!=0) printf(-); for(i=1;in;i+) printf(%d,bi);printf(n);return;if(b1=0) if(a0!=0) printf(-);for(i
11、=1;im;i+)printf(%d,ai);printf(n);return; if(m=n) for(i=1;im;i+) if(aibi&a0=45) 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;ij;i+) printf(%d,di); printf(n);return;else if(a0=45&b0=0) j=minus(b,a,d,n,m);for(i=1;ij;i+)printf(%d,di);printf(
12、n);return; else j=minus(a,b,d,m,n);for(i=1;in&b0=45)j=minus(a,b,d,m,n); for(i=1;ij;i+) printf(%d,di); printf(n);return;if(mn&b0=45) change(a,b,m,n); printf(-); j=minus(a,b,d,n,m); for(i=1;in&a0=45) change(a,b,m,n); printf(-); j=minus(a,b,d,m,n);for(i=1;ij;i+)printf(%d,di);printf(n);return;if(mn&a0=4
13、5)j=minus(b,a,d,n,m);for(i=1;ij;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;iMAX;i+)ci=0;if(m0;i-,s+)for(r=0;r0;j-,k+)dk=ai*bj+dk;if(dk9) dk+1=dk+1+dk/10;dk=dk%10;if(dk=0)k-;y=k;for(r=1;k0;r+,k-)er=dk;for(r=1;rMAX;r+)dr=e
14、r;if(s=1)x=plus(c,d,e,0,y+1);elsex=plus(c,d,e,y,y+1);for(r=0;rn)for(j=n-1,s=1;j0;j-,s+)for(r=0;r0;i-,k+)dk=ai*bj+dk;if(dk9)dk+1=dk+1+dk/10; dk=dk%10;if(dk=0)k-;y=k;for(r=1;k0;r+,k-)er=dk;for(r=1;rMAX;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=0;i-)if(ci)break;if(flag)prin
15、tf(-);printf(%4d,ci-);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);elseprintf( 000%1ld,ci);int write(long a,int flag) / 将键盘敲入的数字按 4 位一组放入 long a, 且将符号放入 flag char numN*4;char temp;int i,j,k;for(i=0;iN*4;i+) numi=getchar(); if(numi=10) i-;b
16、reak; 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=0;max_i-) if(bmax_i)break; for(i=0;i=max_i;i+) if(bi)for(j=first;j=0;len-) if(blen) break; if(first-last)=len) if(first-last)len) flag=1;else for(i=len;i=0;i-) if(afirst-kbi)flag=1; break
17、; if(afirst-kbi) 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=0;max-) if(bmax) break;for(i=0;i=max;i+)if(bi=0;len_a-)if(alen_a)break;k
18、=len_a;while(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-1;len_a=0;
19、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,*p2;p1=&m;p2=&n;menu();s=getchar(); getch
20、ar(); 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(-);for(i=1;ij;i+)printf(%d,ci);elseprintf( 结果是 :a+b=); minusfun(a,b,d,m,n);printf(n);break;case 2:printf( 格式为 :a-b
21、n);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=plus(a,b,c,m,n);printf( 结果是 :a-b=);if(c0!=0)printf(-);for(i=1;ij;i+)printf(%d,ci); else printf( 结果是 :a-b=);minusfun(a,b,d,m,n); printf(n); break;case 3:init(a,b,p1,p2);if(a1=0|b1=0) printf( 结果是 :0
22、n);break;j=multi(a,b,c,m,n); printf( 结果是 :);if(a0=45&b0=0)|(b0=45&a0=0) printf(-);for(i=1;ij;i+)printf(%d,ci); printf(n); break; case 4:flag=fa=fb=0;for(max=0;maxN;max+)admax=bdmax=cdmax=0;printf( 请输入被除数 :);fa=write(cd,fa);printf(n 请输入除数 :);fb=write(bd,fb);div(cd,bd,ad,fa);flag=(fa+fb)%2;printf( / );print(bd,fb);printf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机考试题库及答案及答案【考点梳理】
- 2025年养老护理员职业资格理论基础知识考试题库及参考答案
- 2025普法考试题目及答案
- 2025年养老护理员考试试题及答案
- 2025年儿童心理发展师考试试题及答案
- 13 威武的门神说课稿-2025-2026学年小学美术沪教版四年级上册-沪教版
- 2025年烧伤整形科手术器械项目合作计划书
- 面向实际部署的边缘协同服务缓存与请求卸载技术
- 水生动物苗种繁育工安全生产基础知识竞赛考核试卷含答案
- 金融科技对上市金融机构风险溢出的影响研究
- 快乐读书吧:童年(专项训练)-2023-2024学年六年级语文上册(统编版)(含答案)
- 人教版八年级地理上册期中考试卷(及参考答案)
- 2024电气装置安装工程电气设备交接试验标准
- 山西省太原市志达中学2024-2025学年八年级上学期10月月考数学试题
- GB/T 44281-2024工业互联网平台解决方案分类方法
- 项目验收通知书模板
- 残疾儿童康复救助工作总结
- JT-T 1495-2024 公路水运危险性较大工程专项施工方案编制审查规程
- 第6课《用对立统一的观点看问题》第2框《正确认识和处理人生矛盾》同步课堂课件-【中职专用】《哲学与人生》
- 截长补短课件
- 二型糖尿病论文答辩
评论
0/150
提交评论