




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计作业报告作业名称: 大整数相加减 学 院 计算机科学与工程学院 专 业 计算机软件 学生姓名 awell 任课教师 xxx 提交日期 2012.6.28 1、 问题描述 实现两个大整数的相加减二、系统设计 1、结构说明建立结构类型 node:struct nodeint num;/每个位数用一个int类型表示,其中num=0&numarr2.size()-falg2)/falg1表示输入的第一个整数前面的符号;falg=true;if(arr2.size()-falg2=arr1.size()-falg1)for(int i=0;iarr2i+falg2) falg=true;break;if(i=arr1.size()-falg1-1) falg=false;if(falg)for(int i=arr1.size()-1;i=falg1;i-)node *s;s=new node;s-num=arr1i-0;/从输入的整数尾部逆向建立链表if(fir=NULL) fir=s;else efir-next=s;efir=s;efir-next=NULL;/尾结点的next一定要赋NULL,不然会出现错误for(int i=arr2.size()-1;i=falg2;i-)node *s;s=new node;s-num=arr2i-0;if(sec=NULL) sec=s;else esec-next=s;esec=s;esec-next=NULL;elsefor(int i=arr2.size()-1;i=falg2;i-)node *s;s=new node;s-num=arr2i-0;if(fir=NULL) fir=s;else efir-next=s;efir=s;efir-next=NULL;for(int i=arr1.size()-1;i=falg1;i-)node *s;s=new node;s-num=arr1i-0;if(sec=NULL) sec=s;else esec-next=s;esec=s;esec-next=NULL;if(opration=+) return;if(!falg) f=!f;/f表示整个运算结果的正负void add()/实现加法bool falg=false;/标记是否进位int num2=sec-num;for(node *head1=fir,*head2=sec;head1;head1=head1-next)/因为以fir为表头建立的链表所保存的整数较大,所以,以sec为表头建立的链表会先或者同时遍历到表位int num1=head1-num;head1-num=(falg+num1+num2)%10;falg=(falg+num1+num2)/10;if(head2-next) /判断以sec为表头的链表是否达到表尾head2=head2-next;num2=head2-num;else num2=0;if(f) cout-;if(falg) coutnext)ansi=head1-num+0;i+;for(i-;i=0;i-)coutnum;bool falg=false;/判是否退位for(node *head1=fir,*head2=sec;head1;head1=head1-next)int num1=head1-num;head1-num=num1-num2-falg;if(num1-falg-num2num=head1-num+10;else falg=false;if(head2-next)head2=head2-next;num2=head2-num;else num2=0;int i=0;char *ans=new charsizeof(arr1)+sizeof(arr2);for(node *head1=fir;head1;head1=head1-next)ansi=head1-num+0;i+;i-;falg=false;for(int j=0;j=i;j+)if(ansj!=0) break;if(j=i)falg=true;cout0;return;if(f) cout=0;i-)coutnext;delete tem;for(;sec;)tem=sec;开始sec=sec-next;delete tem;tem=fir=efir=sec=esec=NULL;输入式子判操作程序流程图实现加法实现减法输出结果结束三、程序测试 1、设计测试用例0 + 01 + 110 + 11 + 101000000000000000000000 + 1111111111111111111111111111111111-1 + 11 + -1-10 + 100100 + -10-1000000 + -1000000000000000000000000000000000000000000010 - 101 - 1010 - 11 - 77 - 155555555555555555555555555555555555555555 - 555555555555555555555555555555555-10 - -10-11 - -1-1 - -15515-1 - -8-8 - -1-6666666666666666666666666666666666 - -6666666666666666666666666 2、程序测试结果0 + 0 = 01 + 1 = 210 + 1 = 111 + 10 = 111000000000000000000000 + 1111111111111111111111111111111111 = 1111111111112111111111111111111111 -1 + 1 = 01 + -1 = 0-10 + 100 = 90100 + -10 = 90-1000000 + -10000000000000000000000000000000000000000000 = -1000000000000000000000000000000000000100000010 - 10 = 01 - 10 = -910 - 1 = 91 - 7 = -67 - 1 = 655555555555555555555555555555555555555555 - 555555555555555555555555555555555 = 55555555000000000000000000000000000000000-10 - -10 = 0-11 - -1 = -10-1 - -15515 = 15514-1 - -8 = 7-8 - -1 = -7-6666666666666666666666666666666666 - -6666666666666666666666666 = -6666666660000000000000000000000000四、使用说明 能正确实现两个大整数(包括正负)相加减的运算5、 收获体会及建议完整代码:#include #include #include #include using namespace std;struct nodeint num;node * next;bool f,falg1,falg2;string arr1,arr2;char opration;node *fir=NULL,*efir=NULL,*sec=NULL,*esec=NULL;void creatlist()bool falg=false;if(arr1.size()-falg1arr2.size()-falg2)falg=true;if(arr2.size()-falg2=arr1.size()-falg1)for(int i=0;iarr2i+falg2) falg=true;break;if(i=arr1.size()-falg1-1) falg=false;if(falg)for(int i=arr1.size()-1;i=falg1;i-)node *s;s=new node;s-num=arr1i-0;if(fir=NULL) fir=s;else efir-next=s;efir=s;efir-next=NULL;for(int i=arr2.size()-1;i=falg2;i-)node *s;s=new node;s-num=arr2i-0;if(sec=NULL) sec=s;else esec-next=s;esec=s;esec-next=NULL;elsefor(int i=arr2.size()-1;i=falg2;i-)node *s;s=new node;s-num=arr2i-0;if(fir=NULL) fir=s;else efir-next=s;efir=s;efir-next=NULL;for(int i=arr1.size()-1;i=falg1;i-)node *s;s=new node;s-num=arr1i-0;if(sec=NULL) sec=s;else esec-next=s;esec=s;esec-next=NULL;if(opration=+) return;if(!falg) f=!f;void add()bool falg=false;int num2=sec-num;for(node *head1=fir,*head2=sec;head1;head1=head1-next)int num1=head1-num;head1-num=(falg+num1+num2)%10;falg=(falg+num1+num2)/10;if(head2-next) head2=head2-next;num2=head2-num;else num2=0;if(f) cout-;if(falg) coutnext)ansi=head1-num+0;i+;for(i-;i=0;i-)coutnum;bool falg=false;for(node *head1=fir,*head2=sec;head1;head1=head1-next)int num1=head1-num;head1-num=num1-num2-falg;if(num1-falg-num2num=head1-num+10;else falg=false;if(head2-next)head2=head2-next;num2=head2-num;else num2=0;int i=0;char *ans=new charsizeof(arr1)+sizeof(arr2);for(node *head1=fir;head1;head1=head1-next)ansi=head1-num+0;i+;i-;falg=false;for(int j=0;j=i;j+)if(ansj!=0) break;if(j=i)falg=true;cout0;return;if(f) cout=0;i-)coutnext;delete tem;for(;sec;)tem=sec;sec=sec-next;delete tem;tem=fir=efir=sec=esec=NULL;int main() cout输入算式,形如:endl;couta + b or a - barr1oprationarr2)char tem=opration;f=false,falg1=false,falg2=false;if(arr10=-) falg1=true;if(arr20=-) falg2=true;if(opration=-&falg2)opration=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【语文】辽宁省鞍山市普通高中2025-2026学年高三上学期第一次质量检测试题(解析版)
- 齐鲁安全培训课件
- 2025年钢铁行业绿色转型与产能布局优化:环保投资与产业协同发展研究报告
- 进口货物包装报检课件
- 拆船工招聘考核试卷及答案
- 2025年高二秋季开学摸底考试地理试卷(新高考)(解析版)
- 浙江三类人员安全员c证题库及答案解析
- 宏昌天马安全培训考试题及答案解析
- 护理法学法规知识题库及答案解析
- 川科院护理技能大赛题库及答案解析
- 桥式起重机Q2练习测试题附答案
- 高级茶艺师理论知识试题
- 哈里伯顿Sperry定向钻井介绍专题培训课件
- 2021年江苏省徐州市中考生物试卷(附详解)
- JJF 1704-2018 望远镜式测距仪校准规范
- 石油化工设备维护检修规程通用设备12
- 《三角形的面积》教学设计方案
- GB/T 14667.1-1993粉末冶金铁基结构材料第一部分烧结铁、烧结碳钢、烧结铜钢、烧结铜钼钢
- 带状疱疹及带状疱疹后神经痛
- 2022年毕节市农业发展集团有限公司招聘笔试试题及答案解析
- 卒中单元中的护理
评论
0/150
提交评论