长整数的加减运算系统说明文档11003601.
任意长整数的四则运算

1 题目介绍和功能要求1.1 课程设计题目要求【问题描述】:设计一个实现任意长的整数进行加法运算的演示程序。
【题目容】:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的围是-(215- 1)~(215- 1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【基本要求】:(1)利用所学知识,设计相应的数据结构;(2)熟练运用开发环境;(3)完成软件的设计与编码;(4)熟练地掌握基本的调试方法。
1.2 题目分析【需求分析】:(1)本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
(2)本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
(3)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以回车结束,可以直接输入正数或负数。
按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。
2 系统功能模块结构图2.1 系统功能结构框图图2.1 系统功能结构图2.2主要模块的功能说明:(1)主调程序模块:void main(){初始化;do{接受命令;处理命令;}while(“命令”=”退出”)}(2)双向循环链表处理模块//cmplinklen.h //Creat.h //compare 说明:进行链表的存储和处理(3)长整数运算模块//add.h // sub.h //imul.h //idiv.h 说明:对长整数进行四则运算(4)界面模块//title.h //welcome.h说明:控制系统运行操作界面3 数据结构的设计及用法说明3.1概要说明为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。
超长正整数加法和乘法报告书

信息工程学院数据结构与C语言综合训练报告(2011~2012学年第二学期)报告题目:____超长正整数的加法________姓名:______李莉_______专业:信息管理与信息系统年级班级: ____112班________指导教师:__李宏利、张晶___完成日期:_2012年7月12日一、综合训练目的和要求本综合训练是计算机科学与技术、信息管理与信息系统、软件工程、电子商务专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。
本课综合训练的目的和任务:1. 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言、数据结构解决实际问题的能力二、综合训练任务内容利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。
要求输入和输出每四位一组,组间用逗号隔开。
如:1,0000,0000,0000,0000。
提高要求:完成两个超长正整数的乘法。
三、总体设计函数调用关系图(如下)mainAdd() Output() Input() Change() Mul()Sum()函数的流程图(如下)Y NYNNY开始m=0操作说明 输入字符串a[] Input() n=N输入n 输入字符串b[] Input() n=N ’输入n Change(a) Change(b) 输入mMul()Add()四、详细设计说明主函数模块包括判断函数输入模式是否正确的模块,输入转换模块,数值计算模块和输出模块。
在主函数中首先调用函数Input (),然后调用到函数Change (),在Change ()函数中调用了函数Sum (),随后主函数中又根据操作者调用了函数Add ()或者函数Mul (),最后主函数调用了函数Output ()后程序结束。
超长整数及存储与运算设计说明书

计算机科学系课程设计任务书摘要计算机计算结果的精度,通常要受到计算机硬件环境的限制。
在C语言和VB中对于有符号的长整型数据的范围是-2147483648到2147483647之间,用户一般是无法改变的。
但是,我们可以通过“软”的方式来解决这一困难,即通过程序设计的方法进行超长整型数据的计算。
运算因子超出了整型能表示的范围,肯定不能直接用一个数的形式来表示。
在C语言中,能表示多个数的数据类型有两种:数组和字符串。
因此采用字符串读入数据,用数组存储数据。
解决了高级程序设计语言处理数据存储空间问题,实现了超长整数的加减乘除求余运算。
超长整型数据的存储与运算设计对超长整数分别进行了存储与加减乘除求余运算,达到了预期目标,最后对实现算法做了简要的分析和介绍。
关键词:超长整型数据;字符串;数组AbstractComputer calculation results, the precision of computer hardware environment is usually to the limit. In C language and VB to have long integer data of symbols of integers range is 2147483648 - between the users to can’t be changed. However, we can use the word "soft" way to solve this difficult, namely through programming method for long integer data calculation.Computing factor beyond the scope of integer can say, must not be directly used a number of forms. In C, can say the number of data types is more than two kinds: arrays and string. Therefore, the use of input data using string array of data storage. Solve a high-level programming language processing data storage space, the problem of long integer arithmetic for more add, subtract, multiply and divide.Long integer data storage and operation of long integer separately designed for the storage and add, subtract, multiply and divide more computing, and finally reached the expected goal to realize algorithm provides a brief introduction and analysis.Keywords: long integer;string;array目录第一章绪论 (1)1.1课程背景 (1)1.2课程目的 (1)1.3课程意义 (1)1.4课程设计采取的基本原理和主要技术方法 (1)第二章设计简介及设计方案论述 (2)2.1程序的主要功能 (2)2.2程序设计的思想 (2)2.2.1运算数据、结果的输入和存储 (2)2.2.2超长整数加法运算 (2)2.2.3超长整数减法运算 (3)2.2.4 超长整数乘法运算 (3)2.2.5 超长整数的整除及求余运算 (4)第三章详细设计 (5)3.1超长整型数据的输入 (5)3.2超长整数的加法 (5)3.3超长整数的减法 (6)3.4超长整数的乘法 (6)3.5超长整数的整除及求余 (7)第四章设计结果及分析 (10)4.1设计概述 (10)4.2设计约束 (10)4.3运行流程 (10)总结 (11)致谢 (12)参考文献 (13)附录 (14)第一章绪论1.1 课程背景随着现代社会计算机科学技术与经济的不断飞速发展,计算机在科学计算与人们日常生活中的应用也越来越普及,利用计算机实现一些数据的存储与计算也显得越来越重要,因而相对于科学计算精度的要求也越来越高。
长整数运算说明书.

目录摘要1前言2 1.采用类C语言定义相关的数据类型3 3函数的调用关系图164.调试分析165.测试结果17 6.源程序(带注释)21总结35参考文献37致谢38附件Ⅰ部分源程序代码39摘要该设计要求学生设计程序,实现两个任意长的整数求和及差的运算问题。
通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握线性表上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
关键词:数据结构;长整数;运算问题;C语言前言在计算机及相关专业众多的基础课程里面,算法与数据结构是基础而又十分重要的课程。
本学期开设的《算法与数据结构》课程,在学习科目的第一节课起,张老师就为我们阐述了它的重要性。
它对我们来说具有一定的难度。
它是其它编程语言的一门基本学科。
尽管不好学,但是我们必须学好这门课程,这对于我们计算机专业的学生来说意义重大。
经过一个学期的理论知识的学习,对于数据结构相关的知识有了一定的了解。
这是一门纯属于设计的科目,它需用把理论变为上机调试和具体实践。
在课程结束之后。
老师为我们安排了这次为期两周的课程设计。
目的就是让我们自己在计算机上自己设计算法来实现相应的功能以及锻炼学生的动手能力和实践能力,最重要的是要把我们所学的数据结构的理论知识应运到实践中去。
这次课程设计的题目是“长整数运算”,要求学生自己查阅相关资料,完成相应的任务,自己上机设计算法,调试程序,运行出结果,以此来加深理解线性表、查找表的逻辑结构、存储结构,掌握查找、排序等基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养自己的动手能力。
正文1.采用类c语言定义相关的数据类型#include<stdio.h>#include<malloc.h>typedef struct dnode{int data;//头节点的data域保存数的正负。
实验报告长整数四则运算

实验报告:长整数四则运算实验者:唐怡04120082 题目:设计一个实现任意长的整数进行加法运算的演示程序一.需求分析1.本演示程序中,长整数为任意长的带符号的长整数的输入及求加法后输出的长整数形式为每四位一组,组间用逗号隔开,输入以“回车符”为结束标志。
2.程度执行的命令包括:1)构造整数1,2)构造整数2,3)做加法运算,4)结束3.测试数据(1)0;0;应输出“0”(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”(4)1,0001,0001;-1,0001,0001;应输出“0”(5)1,0001,0001;-1,0001,0000;应输出“1”(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
二.概要设计为实现上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表1.有序表的抽象数据类型定义为:ADT Dulinklist{数据对象:D={ai|ai为带符号整数,1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于集合D,ai-1<ai,i=2,…..,n}基本操作:InitDulinklist(&)操作结果:构造一个空的有序表LDestroyDulinklist(&)初始条件:有序表L已存在操作结果:销毁有序表LDulinklistLength(L)初始条件:有序表L已存在操作结果:返回有序表L的长度DulinklistEmpty(L)初始条件:有序表L已存在操作结果:若有序表L为空表,则返回TUER,否则返回FALSEGetElem(L,pos)初始条件:有序表L已存在操作结果:若干1〈=POS〈=LENGTH(L),则返回有序表L中第POS个数据元素。
数据结构课程设计长整数加减运算

课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长。
正确处理好运算之后的进位和借位。
(1)输入:[-]**,****,****;[-]*,****,****,**** //[-]表示“-”可选(2)输出:**,****,****,****是否继续计算(Y/N):(3)功能:能正确进行相关数据的加减运算(4)测试数据:0;0;输出“0”2345,6789;7654,3211;输出“1,0000,0000”1,0000,0000,0000;-9999,9999;输出“9999,0000,0001”1,0001,00001;-1,0001,0000;输出“0”自选数据二、概要设计1、使用双向循环链表实现长整数的运算及存储,构造双向循环链表,创建双向循环链表表示两个整数2、设计两整数相加的函数Add(),addtwo(),其中Add()调用addtwo()函数,addtwo()具体实现两个整数的加减操作,进位及借位问题;设计显示函数Display()及主函数main()三、详细设计1、数据结构设计双向循环链表的构造t ypedef struct LinkNode{int data; //记录每个节点的整数(小于)LinkNode *next, *pre; //记录下一个节点的地址和前一个节点的地址}linklist;2、创建两个长整数的链表伪算法void Creat(char a[]) //引入字符串,创立两个链表,分别表示两个整数{int 记录字符串i;记录加数节点数j;记录被加数节点数s;标记字符串中的‘-’号记录字符串中的字符转化为整数的值k,使每个节点记录位l while(指针所指不是“;”)被加数字符数m自动加1 //m记录字符串中被加数的字符数n=m;while(执政没有指到结尾处) 总字符串n位数自动加1; //n记录字符串的总字符数if被加数不是负数{head0->data=(-1); //记录整数符号w=1;}else {head0->data=1;}for(i=m-1;i>=w;i--){If指针所指为数字,而不是“,” //把字符转化为整数{k+=(a[i]-'0')*sum(l); //sum()计算的乘方l++;}if(a[i]==','||i==w){把整数存到双向循环链表中s++; //节点数加k=0; //重新初始化k和ll=0;}}head0->pre->data*=s; //存储整数符号和节点数}四、调试分析a、调试过程中,连续输入数字运算,速度会明显变慢,发现在初始化链表及运算后没有释放链表,造成系统资源浪费,经改造后自爱后面添加了析构函数b、算法的时空分析创建整数链表有三个循环,次数都为n。
数据结构课程设计报告长整数运算范文

数据结构课程设计报告长整数运算数据结构课程设计报告题目:长整数四则运算一、需求分析1.问题描述:由于工程上有时候需要对很大的数进行计算,可是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,因此需要设计专门的算法对数据进行相应的计算。
此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。
程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。
2.基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。
功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。
3.输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。
输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。
二、概要设计1.设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。
将各部分的结果整合起来。
由于计算机固有的整数类型存数的对大整数是2^15-1,因此为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。
从最低位开始加法,超过一万向上进位,因此每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算能够借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。
2.数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,因此采用的数据结构的逻辑结构是线性表。
因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
长整数运算说明书

{scanf("%s",&ch1);
if(ch1=='+'||ch1=='-')
{yunsuan(a,b,c,ch1);
OutputNumber(c,1);
break;
}
else
{printf("\n此版本不支持%c运算!是否重新输入运算符?(y/n):",ch1);
scanf("%s",&m);
2.本程序中,集合的元素限定为数字字符[‘0’~’9’]和字பைடு நூலகம்‘,’与‘;’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
3.现实长整数的分组存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
操作结果:将以head为头结点的链表中的所有数据输出到显示屏上。
void add(DLNode *head1,DLNode *head2,DLNode *head3)
操作结果:实现正数加正数的加法操作。
int change(DLNode *head1,DLNode *head2)
操作结果:判断存在俩个链表中的数的大小,如何head1中的数大于head2中的数那么返回值为0,反之返回值为1,相等时返回值为2。
if(m=='Y'||m=='y'){ n=2;printf("\n请输入运算符'-'或'+':");}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桂林电子科技大学综合设计说明书用纸《数据结构与算法》课程设计说明书题目:长整数的加减运算学院:计算机科学与工程学院专业:信息安全姓名:xxxxxxxx学号:11003601xx指导教师:张瑞霞老师2013年9 月13 日成绩评定标准及成绩1、能按照格式进行写作,无抄袭现象(10分)2、报告内容行文通畅,有条理性,无错别字,结构严谨。
(10分)3、能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。
(10分)4、在验收过程中,能合理的回答问题(20分)5、软件能正常运行,实现所提出的功能(40分)6、软件代码规范性较好(5分)7、具有自己的创新或特色(5分)总成绩:目录1、前言 (3)2、需求分析 (4)2.1.问题描述: (4)2.2.基本要求: (4)2.3.更高要求: (4)2.4.测试数据: (4)2.5.开发环境 Visual C++6.0(完整绿色版) (5)3、系统概述 (5)3.1.关键技术。
(5)3.2.相关的函数接口 (6)3.3.功能设计 (7)4、系统分析 (7)5、系统的调试与结果 (17)5.1.调试过程出现的问题以及解决方法 (17)5.2.成功的测试数据截图 (17)6、课设小结 (20)7、参考文献: (21)1、前言本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
由于在某些工程上进行加减运算时,有时候需要对很大的长整数进行计算,但是计算机本身提供的数据类型无法保证存在几百位甚至几千位的数字,所以需要设计专门的算法系统对数据进行相应的计算。
因此本系统的设计主要任务是:设计一个程序能够实现任意长整数的加减运算的程序,而且能够对一些错误异常进行辨别调整,从而迅速计算出正确无误的结果。
程序输入格式是字符串,包含元素的范围是数字,都好,负号以及分号,保存时需要用到双链表将字符串每四位保存在循环链表中的一个结点中,然后在计算出运行结果。
虽然程序有些复杂,但使用方法十分简单,只需按照相关提示进行操作即可,能够为用户的学习和工作带来快捷与方便。
2、需求分析本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
2.1.问题描述:首先最初的目的是设计一个实现任意长的整数进行加法运算的演示程序。
2.2.基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是-(215-1)~(215-1)。
输入输出形式:按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。
2.3.更高要求:(1)仅仅是能运行长整数的加法,还是不能达到我们运算的需求,因此,对于长整数的减法运算的设计将是对我们系统更高的一次挑战。
(2)多个长整数的连续加减法,并带括号等。
具体方式可以参见表达式的求值部分,利用栈。
2.4.测试数据:(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。
(4)1,0001,0001;-1,0001,0001;应输出“0”。
(5)1,0001,0001;-1,0001,0000;应输出“1”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
注:实现提示:(1)每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数。
整个链表是为万进制数。
(2)可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
2.5.开发环境 Visual C++6.0(完整绿色版)Visual C++ 6.0 (完整绿色版)使用说明:1、软件安装后,在桌面和开始菜单里分别建立快捷方式。
2、此版本适用于计算机等级考试上机环境及一般的C++应用。
3、此版本为默认安装后对安装文件夹完整打包,并安装windows\system32下的相应文件。
4、系统默认安装在:C:\Program Files\Microsoft Visual Studio 。
5、VC6.0通用补丁:特别适合于解决错误信息:“Compiling... , Error spawning cl.exe”使用方法:退出VC,运行此文件,单击"是",再启动VC,可解决大部分问题。
6、系统安装后,如果考试系统提示没有安装VC,不影响使用,自行从桌面的快捷方式启动vc,然后打开需要调试的程序,调试即可,不影响考试系统评分。
3、系统概述3.1.关键技术。
3.1.1存储结构:循环双向链表。
循环链表是将单链表的形式稍作改变,不让最后一个结点的指针指为NULL,而让它指向头一个结点;双链表给运算带来的最大好处是可以很容易地找到结点的前驱和后继。
将双链表的头一个结点和最后一个结点连接起来,这样不增加额外存储却给某些运算带来方便。
图3.1.1.加入头结点的循环双链表3.1.2.主要算法的基本思想:每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
3.1.3.数据结构设计:因为计算的事一个连续的数字,需要按顺序一次计算,所以采用的数据结构的逻辑结构是线性表。
根据用户需求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
3.2.相关的函数接口3.2.1.结构体:struct dl_node{int x;dl_node *pre;dl_node *next;};3.2.2.初始化:void list_init(dl_node ** h)3.2.3.插入元素:void list_insert(dl_node *h,int x)3.2.4.输出链表:void prin(dl_node *h)3.2.5.实现相加:void list_add(dl_node *h1,dl_node *h2)3.2.6.实现相减:void list_sub(dl_node *h1,dl_node *h2)3.3.功能设计3.3.1.输入两个数,用链表来存储。
链表的头结点的数据的值为1时,表示的是输入的数非负;为-1时表示输入的数是负数。
3.3.2.在创建链表时,让高位在链表的尾部,低位在链表的头部。
3.3.3.在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。
3.3.4.如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。
3.3.5.异号的两个数想加时,先去两个数的绝对值,用较大的数减去较小的数,差作为和的绝对值。
如果相应的位够减时,直接做减法,否则借位,但是要注意被借位的值是否为零,如果为零,则继续借位。
3.3.6.输出最终结果,输出数时,要去掉大数最前面的零,直到数的首位不是零时为止。
在输出地位的数时,有可能某些单元的数低于四位,必须要在四位数的高位补零,即四位一个单元输出。
空缺处用零补齐。
4、系统分析对于本系统而言:如果是两个长整数相加,每个加数都需要一个循环链表存储,则必须定义两个循环链表h1、h2,即:循环双链表;while(p!=h)循环双向链表一直往右找,直到找到头结点为止{printf(",%04d",p->x);%04d为对齐方式,当一个结点值不足4位则补齐p=p->next;}puts("");}元素值相加,已处理好h1比h2的长度大于等于h1的长度最后结果保存在h1(即长串中)void list_add(dl_node *h1,dl_node *h2){dl_node *p=h1->pre,*q=h2->pre;int e=0;while(q!=h2)每次相加,如果有进位则保存到e变量中{int tmp=p->x+q->x+e;if(tmp>9999){p->x=tmp%10000;e=tmp/10000;}elsep->x=tmp;p=p->pre;q=q->pre;}当h1长度大于h2的时候,还要对未相加的部分进行操作while(p!=h1){int tmp=p->x+e;if(tmp>9999){p->x=tmp%10000;e=tmp/10000;}elsep->x=tmp;p=p->pre;}p=h1->next;如果最高位得到的结果还有进位,那么就要再创建一个结点if(e!=0){dl_node *s;s=(dl_node *)malloc(sizeof(dl_node));s->x=e;s->pre=p->pre;p->pre->next=s;s->next=p;p->pre=s;}}元素值相减方法同相加类似最后结果保存在h1(即长串中)void list_sub(dl_node *h1,dl_node *h2){dl_node *p=h1->pre,*q=h2->pre;此处flag的值即位借位的值,借位的值为0或者为1,因为减0无关紧要int flag=0;while(q!=h2){if(p->x-flag>=q->x){p->x-=q->x+flag;flag=0;}else{p->x=p->x+10000-q->x-flag;flag=1;}p=p->pre;q=q->pre;}同样的,如果h1的长度大于h2的长度,那么对剩下的操作while(p!=h1){if(p->x-flag<0){p->x=p->x+10000-flag;flag=1;}else{p->x=p->x-flag;flag=0;}p=p->pre;}如果最高位为0的话,那么就要删除最高位的结点了p=h1->next;while(p->x==0){p->pre->next=p->next;p->next->pre=p->pre;p=h1->next;}}打印输入提示int main(){cout<<"----------------------------------------------------"<<endl;cout<<"桂林电子科技大学计算机科学与工程学院信息安全"<<endl;cout<<""<<endl;cout<<""<<endl;cout<<" 11003601班罗宗聪"<<endl;cout<<""<<endl;cout<<"----------------------------------------------------"<<endl;cout<<" 欢迎使用-长整数的加减运算-系统"<<endl<<endl;cout<<"请输入两个任意长整数,并以; 隔开,然后‘Enter’"<<endl;cout<<"如:1314,5210 + 5210,1314"<<endl;cout<<" 1314,5210;"<<endl;cout<<" 5210,1314;"<<endl;cout<<" 6524,6524"<<endl;cout<<"----------------------------------------------------"<<endl;// freopen("大数求和.txt","r",stdin);while(1){puts("");char c;int a;dl_node *h1,*h2;list_init(&h1);输入元素,直到读入" ; "则停止输入第一个链表值while(1){//cout<<"asdfa";scanf("%d%c",&a,&c);//cout<<c<<endl;list_insert(h1,a);if(c==';') break;}如果第一个元素小于0,则取负值,并在头结点当中保存信息if(h1->next->x<0){h1->x=-h1->x;h1->next->x=-h1->next->x;}//prin(h1);list_init(&h2);int r=0;相同方法输入第二个链表,碰到" ; "则停止,并且读到文件结束{if(scanf("%d%c",&a,&c)==EOF){r=1;break;}list_insert(h2,a);if(c==';')break;}//cout<<r<<endl;如果第一个元素小于0,则取正值,并在头结点当中保存信息if(h2->next->x<0){h2->x=-h2->x;h2->next->x=-h2->next->x;}/h1_num和h2_num分别表示长度int h1_num=h1->x,h2_num=h2->x;把长的放到h1里面,是为了后面的加减操作更顺利if(abs(h1_num)<abs(h2_num)){dl_node *tmp=h1;h1=h2;h2=tmp;h1_num=h1->x,h2_num=h2->x;}//cout<<h1_num<<" "<<h2_num<<endl;此处为重点部分,分为两个部分,如果h1大于h2四种情况如果h1等于h2也有四种情况如果他们的长度不相等,即h1大于h2了if(abs(h1_num)!=abs(h2_num)){如果都为正数if(h1_num>0&&h2_num>0){//prin(h1);list_add(h1,h2);prin(h1);continue;}如果都为负数elseif(h1_num<0&&h2_num<0){list_add(h1,h2);cout<<"-";prin(h1);continue;}如果h1为正而h2为负else if(h1_num>0&&h2_num<0){list_sub(h1,h2);prin(h1);continue;}如果h1为负而h2为正elseif(h1_num<0&&h2_num>0){cout<<"-";list_sub(h1,h2);prin(h1);}}否则,如果他们长度都相等的话:else{如果都为正数if(h1_num>0&&h2_num>0){list_add(h1,h2);prin(h1);continue;}如果都为负数else if(h1_num<0&&h2_num<0){list_add(h1,h2);cout<<"-";prin(h1);continue;}如果h1为正而h2为负elseif(h1_num>0&&h2_num<0){这种情况,如果h1最高结点元素大于h2的最高元素,那么交换链表if(h1->next->x<h2->next->x){dl_node *tmp=h1;h1=h2;h2=tmp;//h1_num=h1->x,h2_num=h2->x;//prin(h1);//prin(h2);这种情况得先输出一个负号cout<<"-";}交换之后加法还是一样list_sub(h1,h2);continue;}如果h1为负而h2为正elseif(h1_num<0&&h2_num>0){if(h1->next->x<h2->next->x){dl_node *tmp=h1;h1=h2;h2=tmp;//cout<<"-";}否则为负值,要输出负号else cout<<"-";list_sub(h1,h2);prin(h1);}}5、系统的调试与结果5.1.调试过程出现的问题以及解决方法由于对编程的熟练度不是很高,所以在编程的过程中往往很容易出现错误。