长整数的加法运算数据结构与算法课程设计.docx

上传人:b****4 文档编号:3660732 上传时间:2022-11-24 格式:DOCX 页数:9 大小:127.96KB
下载 相关 举报
长整数的加法运算数据结构与算法课程设计.docx_第1页
第1页 / 共9页
长整数的加法运算数据结构与算法课程设计.docx_第2页
第2页 / 共9页
长整数的加法运算数据结构与算法课程设计.docx_第3页
第3页 / 共9页
长整数的加法运算数据结构与算法课程设计.docx_第4页
第4页 / 共9页
长整数的加法运算数据结构与算法课程设计.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

长整数的加法运算数据结构与算法课程设计.docx

《长整数的加法运算数据结构与算法课程设计.docx》由会员分享,可在线阅读,更多相关《长整数的加法运算数据结构与算法课程设计.docx(9页珍藏版)》请在冰豆网上搜索。

长整数的加法运算数据结构与算法课程设计.docx

长整数的加法运算数据结构与算法课程设计

 

题目:

长整数的加法运算

学院:

计算机科学与工程学院

专业:

信息安全

*************************

学号:

**********

**********************

 

2014年10月18日

 

引言

随着计算机技术的发展,人们利用计算机开发了许许多多方便的,实用的应用软件,在信息化的现代社会里,人们依赖着很多的应用软件,这些软件在推进社会发展的同时,也丰富了人们的生活,然而,在开发过程中,由于计算机系统的局限性,在需要某些功能时,总会遇到困难。

例如在开发某些工程项目时,有时需要对很大的数进行计算。

但是计算机本身无法计算某些较大的数,所以我们有必要设计专门的算法对一些较大的数进行相应的计算,通过简化运算之后,对其他程序功能的编写能起到良好的促进作用,大大的减轻了程序员的负担。

此次设计的程序将用于长整数的加法运算,程序运行时,将提示用户输入两个长整数,然后将两个长整数相加的结果输出。

1、系统概述

在该长整数加法运算系统中,我将定义双向循环链表来表示长整数,按照中国对长整数的表示方法,如199999999表示为1,9999,9999。

双向循环链表数据域存储的是长整数的每4位。

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。

所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

通过造双向循环链表,可以对长整数进行方便的存储,在对长整数进行数学运算时,也能通过方便的操作链表,从而对长整数进行需要的计算。

在实现该长整数加法运算的系统中,我将会编程实现以下功能。

定义一个函数,用于接收长整数的输入,同时将长整数存储到双向循环链表当中,为了检验是否按预期要求进行存储,我还会编写一个函数,将双向循环链表中数据域的值打印出来。

定义一个长整数相加的函数,实现两个长整数加法运算的功能,实际上是对双向循环链表进行操作,这里包括结点空间的申请,插入结点,修改指针所保存的值。

当两个长整数完成加法运算后,我会定义一个显示结果的函数,将它们相加的结果打印出来。

一些较大的整数,在单纯的用计算机进行相加运算的时候可能会产生溢出现象,但该系统每次只对4位整数进行运算,避免了数据过大在计算时产生的溢出问题。

2、系统分析

2.1需求分析

设计一个计算两个长整数加法的程序,要求长整数的位数不能规定上限。

根据中国对于长整数的表示习惯,长整数每4位用逗号隔开。

故可以利用双向循环链表对长整数进行存储,每个结点可以存储长整数的4位,即每个结点的数据域最大值为9999,头结点的数据域的值的正负号可以表示长整数的正负,其绝对值可以表示结点数目。

为了运算与编程的方便,在相加过程中不要破坏两个操作数链表。

2.2系统功能

(1)建立双向循环链表,用于保存长整数及长整数的运算。

(2)接收长整数的输入,长整数的每4位都保存到链表的结点中。

(3)对存入双向链表的长整数进行加法运算,在进行运算时,能很好的处理进位,借位问题以及对长整数的正负能做出判断,然后进行相应的运算处理,保证运算结果能与预期结果一致。

(4)正确的输出运算后的结果,这里的运算结果也是长整数,故对数的存储也是采用双向循环链表,输出结果即是按长整数的显示方式打印出双向循环链表数据域的值。

2.3开发环境

所用开发环境为微软公司开发的VC++6.0软件,该软件可将“高级语言”翻译为“机器语言”,该程序开发语言为C语言。

3、详细设计

3.1功能结构框图

图3-1系统功能结构框图

这是长整数相加运算的一个设计思路。

在该系统中,我会设置几个函数,分别实现不同的功能,如接收数据输入的函数,将两个长整数进行相加的函数,显示出长整数相加结果的函数。

重点是在加法运算的函数里,在功能结构框图中只是大致的介绍出设计思路,分3种情况考虑,具体在每种情况里,也分许多细小的情况进行处理。

该系统重要的部分是对双向循环链表进行操作。

3.2软件设计

3.2.1定义链表与接收数据输入

因为该系统的功能是对长整数进行运算,所以对长整数是用双向循环链表进行存储,链表每个结点均存储绝对值不超过9999的整数,在进行运算时,依次对每个结点进行运算,再判断是否需要进位和借位。

该系统主要使用的数据结构是双向循环链表,无任何特殊的算法,只有对双向循环链表的一些简单操作,如插入操作,注意前驱指针和后继指针发生变化时的修改即可。

(1)定义双向循环链表的抽象数据类型

图3-2双向循环链表的结点定义

此双向循环链表中,定义了一个头结点来保存长整数的信息,即头结点的正负表示该长整数的正负,头结点数据域的绝对值表示双向循环链表除头结点外的结点个数。

为了后面的编程方便,将结点类型重命名为PNODE。

头结点数据域的信息对于加法运算起到一定的作用。

用双向循环链表来保存长整数,避免了长整数位数达到上限的问题,间接的解决了计算机无法计算某些较大整数的问题。

同时,定义了一个双链表类型的结构体,对双向循环链表的头指针和尾指针进行封装,双链表类型的结构体可以准确的表示长整数。

同样为了后续的编程方便,将双向循环链表类型的结构体重命名为List。

数据类型如下图所示,

图3-2定义List指针表示双向循环链表

(2)接收长整数的输入

定义一个函数,用于接收长整数的输入,将长整数保存到双向循环链表中,长整数的每4位分别保存到链表的结点数据域中。

在接收数据输入时,提示用户按XXXX,XXXX,XXXX;的格式输入,该程序定义了一个charch用于保存“,”和“;”,当用户输入分号时表示结束输入,逗号用于间隔开每个结点。

在接收用户的输入时,采用的方法是先让用户输入整型变量,然后再输入字符型变量,即提示用户每输入一个4位整数,就输入逗号或分号,若用户输入分号,则表示用户输入数据完毕,每输入一个4位整数,申请一个PNODE型的结点空间(申请结点空间的时候要注意判断结点空间是否申请成功,若申请结点空间失败,则打印提示信息,然后退出函数的操作),然后将该结点空间插入表示长整数的双向循环链表中,新申请结点的前驱指针保存原链表最后一个结点的地址,后继指针保存最高位结点的地址,这里是通过while循环的方式把双向循环链表建立起来,直到输入ch的值为分号时,结束链表的建立。

这时4位整数已经存储到链表的结点数据域中,长整数已经用双向循环链表表示。

输入完成后,判断出head->next->data的正负以及统计出除头结点外的其他结点个数,然后将结果保存到头结点的数据域中,用于表示长整数的正负及长整数的位数长度。

为了确定长整数已经按预期的形式保存到双向循环链表当中,我设置了一个打印链表的函数,从头结点的后继结点开始对链表进行访问,直到访问到链表最后一个结点为止,将链表中的每个结点数据域打印出来,观察其结果。

如果某个结点的数据域的值为0000,打印链表时显示出来的结果是0,这对后面的计算没有影响,类似于这样的问题在计算完长整数后,显示结果时会进行处理,此时仅是确认链表中数据域的信息。

长整数接收输入完毕后,已经保存到一个带有头结点的链表当中了,为了后续的计算方便,需要对该双向循环链表设置一个尾指针。

定义一个函数,用于设置双向循环链表的尾指针,在该函数中定义一个PNODE类型的变量p,p从链表的头结点的后继结点开始进行访问,当p访问到链表的最后一个结点时,结束循环,将p作为函数的返回值返回,此时p表示的便是该双向循环链表的尾指针。

因为在加法的操作中,都是先对双向循环链表的最后一个结点进行操作,所以设置尾指针是很方便的,很有必要的。

3.2.2长整数的加法运算

长整数是用双向循环链表进行存储的,对长整数进行加法运算,相当于对双向循环链表操作。

在此程序当中,进行加法运算时,可分为3种不同的情况,即两正数相加,两负数相加,两符号互异的数进行相加,符号互异的两数在进行运算时,可视为做减法运算。

下面进行详细的介绍。

链表相加操作时,采用的思路是将长度较短的链表加到长度较长的链表中,所以在相加之前,先计算出两个链表的长度,用长度较长的链表先保存计算结果,最后将结果赋给“结果”链表。

为了说明及编程方便,用p指向长链表的尾结点,用q指向短链表的尾结点,此次设计的思想是长链表的值加上短链表的值,最后保存长链表。

(1)两正数相加

如果两个都是绝对值不超过9999的整数,则将两个数进行相加,即将p的数据域的值加上q的数据域的值,然后判断相加结果即p结点的数据域的值是否超过9999,如果超过9999,则需要进行进位处理,即申请一个PNODE型结点空间,其数据域用于保存进位值,进位值为1,将该结点插入头结点的后面,头结点的后继指针保存该结点的地址,该结点的前驱指针保存头结点的地址,后继指针保存原头结点后继结点的地址。

若不产生进位,则用result_list保存所得到的结果链表,result_list为List类型的变量,即它表示双向循环链表。

如果两个长整数当中,有超过9999的数,即该链表中存在多个结点,则对其从最后一个结点进行操作,即p结点数据域的值加上q结点数据域的值,pq指针依次往前访问链表,重复如上的相加操作,直到p或q访问到头结点为止,出现需要进位的情况时,前驱结点数据域进行加一操作,该结点数据域进行减10000的操作,若在最高4位结点产生进位,则申请一个PNODE型的结点空间,其数据域保存进位值,将该结点插入头结点的后继结点,注意保持链表最后一个结点的后继指针一直保存头结点后继指针的地址,保证该链表一直是双向循环的,否则在打印链表时会出现指针异常的情况。

最后用result_list保存所得到的结果链表。

(2)两负数相加

当两个长整数均为负数时,进行以下操作。

如果两数当中存在一个数,其绝对值小于9999时,分为两种情况,一种是两个数的绝对值都小于9999,另一种则是只有一个数的绝对值小于9999。

当两个数的绝对值都小于9999时,将两个双向循环链表的尾结点数据域进行相加,即p结点数据域的值加上q结点数据域的值,若相加结果<-9999,则产生进位,此时要做进位处理,即申请一个PNODE型的结点空间,命名为high,high的数据域的值为-1,p数据域的值加上10000然后进行取反操作,操作结果用result_list进行保存。

如果只有一个数的绝对值小于9999,另一个数的绝对值大于9999,则先将q->data进行取反操作,再将其与p->data进行相加,同时从p指向的结点开始进行进位判断,直到判断到最高位结点为止,此处的进位处理情况与

(1)中的进位处理相同,但在处理最高位时,要注意符号的正负性。

若在最高位产生进位,则申请新的PNODE型结点空间,命名为high,high->data的值为-1,此时p指向的是最高位结点,则p的数据域的值先加上10000,然后进行取反操作,这是为了将第2个4位整数的负号去除。

除上述两种情况,其他情况下可对表示长整数的链表,从其尾结点处开始,将q->data加到p->data中,在进行相加的过程中判断是否需要进位,若相加结果绝对值超过9999,则需要进行进位处理(最高位进位做特殊处理),即前驱结点进行+1操作,该结点数据域进行-10000的操作。

若操作到最高位的数据域,则申请新的PNODE型结点空间,命名为high,high->data的值为-1,此时p指向的是最高位结点,则p的数据域的值先加上10000,然后进行取反操作,这是为了将负号去除。

最后所得的结果用result_list链表进行存储,将该变量作为相加函数的返回值。

若两个链表长短不同,q已经访问到最高位结点而p还未访问到最高位结点,则先将q的数据域的值进行取反操作,然后与p数据域的值进行相加,这里判断进位,处理进位的方法与上述情况相同。

(3)两符号互异的长整数相加,做相减运算

①当且仅当两个长整数绝对值均不大于9999时,直接将两个链表的尾结点数据域进行相加,即p结点数据域的值加上q结点数据域的值,将所得结果的链表用result_list进行存储。

两个绝对值不超过9999的数,且两数的符号互异(即两数为一正一负),它们在做加法运算时,所得的结果长整数的绝对值不会超过9999,故这里不用考虑进位的问题,两数直接相加即可。

②两个长整数当中存在一个长整数的绝对值不超过9999时,若q->data为负数,判断p->data与q->data的绝对值大小,若p->data的绝对值小于q->data,则需要进行借位操作,即p的前驱结点数据域进行-1操作,p结点数据域进行+10000操作,如果不需要借位,则p的数据域和q的数据域直接进行相加。

最后结果用result_list存储,将result_list返回。

如果q->data为正数,判断p结点数据域与q结点数据域的大小,若p->datadata,则需要进行借位操作,然后p结点的数据域减掉q结点数据域的值。

若不需要借位操作,则p的数据域直接减去q的数据域的值。

③两个长整数的绝对值均大于9999,时,均从链表的尾结点开始进行相减操作,在需要借位时,前驱结点的数据域-1,自身结点的数据域+10000,若q已到达最高位,p还未到达最高位时,判断p的数据域与q的数据域的值,看是否需要进行借位操作,然后p的数据域的值直接加上q的数据域的值。

若p和q同时指向最高位的结点,则它们的数据域的值可以直接进行相加操作。

最后所得到的的结果链表用result_list进行存储,将result_list返回。

3.2.3显示长整数相加结果

由程序可知,两个长整数相加的结果是用List类型的双向循环链表进行存储,可以通过定义一个简单的打印链表数据域的值的函数,将长整数相加的结果打印出来。

在打印链表的过程中,可做一些处理,使得显示结果不影响长整数的数值大小。

在打印每个结点数据域之前对数据域的值进行判断,若结点数据域的值小于1000,可在显示数据前面“补0”,使得每个结点显示出来的都是“4位整数”。

在打印链表时,定义一个PNODE类型的p,用p从最高位结点开始,依次访问链表中的每个结点,直到尾结点,然后将结点的数据域的值“按要求”显示在屏幕上,即打印出来的结点数据域的值用逗号隔开,这就是中国对于长整数的传统表示方法。

程序运行结果如下图所示:

图3-3程序运行结果

4、所遇到的问题和分析解决

4.1对双向循环链表进行操作时,总是出现指针异常的情况,如在做插入操作时,需要修改指针的值,无意间使某些指针成为“野指针”。

通过分析每个指针变量所存储的信息,便可找出异常指针,然后将其赋为NULL指针或者修改其信息,使该指针成为正确的指针,同时,在定义指针的时候要将指针的值初始化为NULL,这样可以避免指针成为“野指针”。

4.2在进行相加(相减)操作时,所得到的相加(相减)结果不是预期结果。

解决该问题,要通过分析测试数据的性质,观察两个测试长整数满足了什么条件,执行了程序当中的哪条语句,是哪条语句或语句块没有考虑到功能的完善性,再进一步的从数学角度分析数的性质,最后通过修改部分语句,完善其功能。

4.3在输出长整数相加结果的函数当中,输出的长整数产生“错误”,如1,0001的数输出为1,1。

要解决该问题,先分析长整数的性质,通过分析,发现除最高位结点外,其他结点的数据域的值,小于1000的数要在前面补上“0”,使他们以4位整数的形式输出,这样才不会影响整个长整数的大小及表示方法。

5、系统特色及关键技术

该系统的特色在于能计算较大的,位数较长的长整数。

无论多长的整数,运用该系统进行计算时,都可以将该整数按每4位的“分割”方法,将4位整数保存到双向循环链表的结点数据域中,然后再进行计算(即对链表进行操作,如修改指针,数据域的值),相当于每次只进行4位数的计算。

解决了计算机无法计算一些较大数据的问题。

关键技术在于双向循环链表的操作以及在做长整数相加操作时的进位,借位操作。

做相加操作之前,先计算出两个链表的长度,将较短的链表“加进”较长的链表中,最后直接用较长的链表表示相加结果,这样就不需要额外建立一个链表来保存两个长整数相加的结果,减少了结点空间的申请。

6、结论

在本次的数据结构与算法课程设计中,该系统提供了长整数加法运算的功能,根据课程设计指导书的测试数据进行测试,该系统也成功实现了这些数据的加法运算。

与加法算法类似,该系统中也可以增加长整数减法功能,还可以通过查阅更多的相关资料,文献,增加乘法,除法功能。

对于需要使用该系统的读者需注意,在进行输入长整数的时候务必要按xxxx,xxxx,xxxx;的格式进行输入,否则会出现错误,导致程序无法执行。

在接收数据输入时,我采用的方法是先输入整型变量,然后再输入字符型变量,这里对用户的使用有所限制,仍需要改进。

通过本次的数据结构与算法课程设计,我体会到了开发项目的艰辛。

对于一个优秀的程序来说,除了要熟练掌握一门编程语言之外,还要掌握并熟练使用数据结构与算法,尤其是一些经典的算法。

开发一个系统或应用软件,除了要有一腔热血之外,我认为更重要的是要有毅力,贵在坚持。

开发一个软件项目,从查阅资料,了解用户需求,到最后的调试程序,维护系统,每一个阶段都是环环相扣的,前面的工作是为后面作铺垫,后阶段的工作也是基于前阶段的工作。

在理论课的学习上,我感到学习的知识抽象性很强,幸运的是通过课程设计的实践,能让我进行充分的思考,尽情地发挥出自己在课堂上所学到的理论知识。

此次的课程设计,让我的思维活跃了起来,闲暇的时间我总在想对于该系统用什么数据结构和算法比较合适,也让我的思维比以前更加严谨(如在判断长整数什么时候该进位,借位,长整数的正负该适于做什么运算,这时该如何对双向循环链表进行操作)。

也许程序员们每天就是在做这些事情吧,当然,要从事编程行业的话,是要不断的学习的,毕竟知识每天都在更新变化,我们需要保持学习的热情,有句话叫“让编程改变世界”,同时也希望我以后能在编程的道路上学到更多,使自己的思维更加活跃而严谨,如果有机会,我会尝试去开发更完整,更完善的程序。

 

参考文献

[1]刘艳飞,迟剑,房健等.C语言范例开发大全[M].北京:

清华大学出版社2010:

578~582.

[2]黄国瑜,叶乃菁.数据结构[M].北京:

清华大学出版社,2001:

320~343.

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1