数据结构课程设计报告(大整数的运算)

合集下载

数据结构课程设计实践报告大整数加法

数据结构课程设计实践报告大整数加法

数据结构课程设计实践报告大整数加法下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

本文下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Downloaded tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The documentscan be customized and modified after downloading, please adjust and use it accordingto actual needs, thank you!In addition, our shop provides you with various types of practical materials, suchas educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!第一节。

长整数的代数计算----数据结构课程设计

长整数的代数计算----数据结构课程设计

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:长整数的代数计算院(系):计算机学院专业:计算机科学与技术班级:学号:姓名:指导教师:沈阳航空航天大学课程设计报告目录1 题目介绍和功能要求 (1)1.1题目介绍 (1)1.2功能要求 (1)1.3基本功能 (1)2 系统功能模块结构图 (2)2.1系统功能结构框图 (2)2.2系统主要模块的功能说明 (2)3 使用的数据结构的描述 (4)3.1数据结构设计 (4)3.2数据结构用法说明 (4)4 函数的描述 (5)4.1主要函数设计 (5)4.2主要函数流程图 (6)5程序测试和运行的结果 (11)5.1程序测试 (11)5.2运行结果 (12)6参考文献 (14)附录(关键部分程序清单) (15)沈阳航空航天大学课程设计报告1 题目介绍和功能要求1.1 题目介绍设计数据结构完成长整数的表示和存储,并编写算法来实现两个长整数的加、减、乘、除等基本代数运算。

1.2 功能要求1) 长整数长度在一百位以上。

2)实现两长整数在同余代数下的加、减、乘、除操作。

即实现算法来求解a+b mod n,a-b mod n,a*b mod n,a\b mod n。

3)输入输出均在文件中。

(选作)1.3 基本功能1.jiafa();将一百位以上的长整数进行加法运算,计算出和。

2.jianfa();将一百位以上的长整数进行减法运算,计算出差。

3.chenfa();将一百位以上的长整数进行乘法运算,计算出积。

4.chufa();将一百位以上的长整数进行除法运算,计算出商和余数。

2 系统功能模块结构图2.1 系统功能结构框图图2.1 系统功能结构框图2.2 系统主要模块的功能说明1.主模块kongzhi();控制输入模块、加法模块、减法模块、乘法模块、除法模块、输出模块的循环使用。

2.输入模块shuru();将输入的两组长整数分别通过转换将其转换成所需要的形式存储到两个链表(opr1、opr2)中保存起来。

数据结构课程设计长整数加减运算

数据结构课程设计长整数加减运算

课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。

长整数的长度没有限制,可以是任意长。

正确处理好运算之后的进位和借位。

(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章课题概述 (1)1.1课题的目的 (1)1.2课题的要求 (1)1.2.1 输入输出的要求 (1)1.2.2 程序实现的功能要求 (1)第2章概要设计 (3)2.1整个程序的模块结构及流程 (3)2.2大整数存储结构的选择 (3)2.3输入数据合法性的检测及初步处理 (4)2.4各个操作算法的描述 (5)2.4.1 相加算法 (5)2.4.2 相减算法 (7)2.4.3 相乘算法 (8)2.4.4 相除算法 (10)第3章程序功能的实现 (16)3.1主函数的实现 (16)3.2主要功能模块的实现 (18)3.2.1 加法的实现 (18)3.2.2 减法的实现 (19)3.2.3 乘法的实现 (22)3.2.4 除法的实现 (23)第4章调试及发现问题的解决 (29)第5章程序测试及分析 (31)第6章总结 (37)参考文献 (39)第1章课题概述本次数据结构课程设计的题目是设计并实现大整数(超过十位的整数)的加减乘除运算。

1.1 课题的目的整数的加减乘除运算是日常生活中常见的四则数学运算。

在不借助计算器的手工条件下,人们往往会通过列竖式的形式来计算结果。

当借助计算机来运算时,虽然不用列竖式那么麻烦了,但是由于计算机对于整数的存储往往只有2B或4B 的空间,因此能够表示的整数存储范围比较有限。

即使采用四个字节来存储整数,它所能表示的范围为:[-2147483648,+2147483647]。

一般称超过十位以上的十进制整数为大整数,这类大整数在C语言系统中因超界溢出,是不能直接用基本数据类型来表示和计算的。

因此,采用特定的数据结构和算法,通过编写计算机程序的方式来实现这些功能,无疑具有较大的实际意义。

1.2 课题的要求1.2.1 输入输出的要求(1)程序运行后应首先输出一个主菜单,并将所有的加、减、乘、除等功能罗列在主菜单上供用户进行选择,以便进行相应的操作。

(2)运算对象应能够从键盘输入,并且运算过程中可以不断更新运算的输入数据。

大整数地运算大数据结构课程设计

大整数地运算大数据结构课程设计

目录一、题目概述〔内容与要求〕2二、功能分析2三、设计3四、运行与测试4五、总结21六、参考文献21一、题目概述〔内容与要求〕内容:请设计一个有效的算法,可以进展两个n位大整数的四如此运算。

①长整数长度在二十位以上。

②实现两长整数的加、减、乘、除操作。

要求:1.设计数据结构,存储结构;2.在c兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.软件运行,给出测试数据。

二、功能分析1.设计一个实现长整数进展四如此运算的程序,长整数长度在二十位以上,有正负数的区别。

2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号完毕长整型数据的输入。

用lnode结点数据结构存储数据。

每一个数据有一个头结点,它的data域用来放数据的正负数。

其余结点的数都为正整数。

3.程序包含数据的输入,判断,运算,输出和主函数。

4.具体程序执行的命令包括:a)输入函数:inputa();inputb();//的输入并建立双向循环链表b)判断函数:pare();//比拟数据的大小c)运算函数:unsigndeadd();//无符号的加法a)unsigndesub();//无符号的减法b)add();sub();mul();div();//加减乘除四如此运算d)输出函数:divput();//除法结果的输出函数a)putoutc();//其余结果的输出函数e)主函数:main();5.系统功能结构框图系统功能结构框图三、设计首先要考虑的是如何表示长整型数。

可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。

(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。

(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。

数据结构课程设计报告长整数运算范文

数据结构课程设计报告长整数运算范文

数据结构课程设计报告长整数运算数据结构课程设计报告题目:长整数四则运算一、需求分析1.问题描述:由于工程上有时候需要对很大的数进行计算,可是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,因此需要设计专门的算法对数据进行相应的计算。

此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。

程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。

2.基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。

功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。

3.输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。

输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。

二、概要设计1.设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。

将各部分的结果整合起来。

由于计算机固有的整数类型存数的对大整数是2^15-1,因此为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。

从最低位开始加法,超过一万向上进位,因此每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算能够借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。

2.数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,因此采用的数据结构的逻辑结构是线性表。

因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。

数据结构》课程设计报告-实现对算术四则溷合运算表达式的求值以及大整数计算

数据结构》课程设计报告-实现对算术四则溷合运算表达式的求值以及大整数计算

江汉大学文理学院课程设计报告课程名称:设计题目:系别:专业:组别:学生姓名:起止日期:年月日~年月日指导教师:承诺书本人郑重声明:本人所呈交的学术论文,是本人在导师指导下独立进行研究工作所取得的成果。

除文中已经注明引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写过的作品成果。

对本文的研究作出重要贡献的个人和集体,均已在文中以明确的方式标明。

本人完全意识到本声明的法律结果由本人承担。

学生(签名):年月日《数据结构》课程设计报告题目:实现对算术四则混合运算表达式的求值以及大整数计算一.设计目的数据结构是计算机专业的核心课程,是一门实践性很强的课程。

课程设计是加强学生实践能力的一个强有力手段,要求学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并上机调试的基本方法,还要求学生在完成程序设计的同时能够写出比较规范的设计报告。

严格实施课程设计这一环节,对于学生基本程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。

二.问题描述(一)当用户输入一个合法的算术表达式后,能够返回正确的结果。

能够计算的运算符包括:加、减、乘、除、括号;能够计算的操作数要求在实数范围内;对于异常表达式能给出错误提示。

(二)求两个不超过200位的非负整数的和,积和商。

三.调试与操作说明(一)需求分析本程序所做的工作为:能直接求出四则表达式的值,并输出;可以解决因数值位数太大unsigned类型都无法表示的大数之间的运算。

本程序可用于小学教师对学生作业的快速批改以及对数值位数要求较大的科学运算。

此程序规定:1.程序的主要功能包括两部分:表达式求解和大整数的运算。

2.表达式求解中输入的必需为一个正确的四则表达式,可以是整型也可以为浮点型,比如:3*(7-2)+5和3.154*(12+18)-23。

大整数的运算中根据提示要输入两行数据位数不能大于200位。

3.程序的输出:表达式求解中为一浮点型数据,大整数运算中输出的即为运算之后的结果,结果里不能有多余的前导0。

大整数计算实验报告

大整数计算实验报告

石家庄经济学院实验报告学院: 信息工程学院专业: 计算机科学技术计算机人论坛1.需求分析1.1开发背景在现实生活中不可避免地我们会遇到一些超大整数之间的运算,比如要计算马云的资产,以及国有银行的转账收入支出等一些数的存储等等类似的问题,而由于计算机整形数的最小值和最大值范围仅为-32768到32767,所以关于大整数的实验即呼之欲出,本实验就是针对数值很大、精度很高的大整数进行的加法减法以及乘法的计算。

1.2数据需求指针:L1,L2:分别为指向这两条存储要进行运算的链表头结点的指针;L3:指向乘法的结果链表;L4:在运算乘法的时候做中间量使用。

prior:双向链表的头指针;next:双向链表的尾指针。

data:整形数,链表所存的数据。

1.3功能需求对一个进行运算的软件,加法和减法是最基本的运算,本实验又额外增加了大整数的乘法。

1.4测试数据第一个数:9,568,974,512;第二个数:8,648,761,512;2.概要设计2.1功能模块图由需求分析可画出如下功能模块图。

图2-1 功能模块图2.2各功能子程序定义1.创建链表:Status creat(DuLinkList &L,char str[30]);2.输出链表中结点内的数据:Status output(DuLinkList L);3.加法:DulNode *Add(DuLinkList L1,DuLinkList L2);4.减法:DulNode *Sub(DuLinkList L1,DuLinkList L2);5.乘法:DulNode *Mul(DuLinkList L1,DuLinkList L2);计算机人论坛2.3主界面截图图2-3 程序主界面3.详细设计3.1数据结构设计此款软件是基于线性表双向链表完成的,在每个分过程中都充分利用了链表指针灵活又不太易于掌控的特性,但若是全面理解指针以及链表的特点,也是很容易设计此款软件的。

数据结构课程设计报告长整数运算

数据结构课程设计报告长整数运算

数据结构课程设计报告题目:长整数四则运算一、需求分析1. 问题描述:由于工程上有时候需要对很大的数进行计算,但是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,所以需要设计专门的算法对数据进行相应的计算。

此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。

程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。

2. 基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。

功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。

3. 输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。

输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。

二、概要设计1. 设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。

将各部分的结果整合起来。

由于计算机固有的整数类型存数的对大整数是2人15-1 ,所以为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。

从最低位开始加法,超过一万向上进位,所以每次加法应该是对应两个结点和进位数相加,进位值初始为0 ;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0 ;除法的计算可以借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。

2. 数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,所以采用的数据结构的逻辑结构是线性表。

因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。

1.双向循环链表的抽象数据类型定义为:ADT Link{数据对象:D={ai | ai € CharSet , i=1 , 2 , .......... , n, n > 0}数据关系;R={<ai-1,ai> | ai-1,ai € D,i=2 , ............ , n}}基本操作:InitLinkList(&L,a) 操作结果:构造一个双向循环链表L ,用a 判断是正数还是负数DestroyList(&L)初始条件:双向循环两已经存在操作结果:销毁有序表LInsert(&L,a) 初始条件:双向循环链表已经存在操作结果:在循环链表的末尾插入一个结点,且此结点的数据值为 a HeadInsert(&L,a)初始条件:双向循环链表已经存在操作结果:在循环链表的头结点后插入一个结点,且此结点的数据值为 a CountNode(&L)初始条件:双向循环链表存在操作结果:计算出链表中结点的个数,并返回个数Compare(&L1, &L2) 初始条件:L1 和L2 存在操作结果:比较两个双向循环链表的大小,用返回值 1 表示L1 大于L2, 返回值-1 标志L1 小于L2, 返回值0 标志L1 和L2 相等ToNum(*s,i,&e)初始条件:s 为字符串中指向某个字符的指针操作结果:将s 的前i 个字符转换为数字,存入 e 中CreatNum(&L,&s)初始条件:s 为某个字符串,双向循环链表L 存在操作结果:将字符串s 转换成数字存入到循环链表L 中Add(L1 ,L2, op)初始条件:双向循环链表L1 和L2 存在,op 为结果的标识符操作结果:两个链表相加,求出结果。

大整数课程设计报告

大整数课程设计报告

中国矿业大学银川学院数据结构课程设计报告(2011/2012学年第二学期)题目名称《大整数代数运算》系部机电动力与信息工程系专业计算机科学与技术班级 10级计算机(一)班学生牛建强 102100510054 学生王雪琴 120100510004 学生李自丹 120100510005 完成时间 2011年 6 月指导老师王居平目录引言 (3)1.1问题描述 (4)1.2基本要求 (4)1.3输入输出 (4)1.4小组分工 (4)概要设计 (4)2.1设计思路 (4)2.2数据结构设计 (5)2.3各模块之间的调用关系: (5)详细设计 (5)3.1 数组初始化 (5)3.2 算法 (6)3.3 主程序 (15)调试与测试 (17)总结心得 (17)附录:源程序清单及运行结果 (19)参考文献 (30)引言大整数运算在科学计算中有着很重要的位置,所谓的大整数运算,是指参与运算的数(加数,减数,因子等)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。

高精度运算主要解决以下三个问题:一、加数、减数、运算结果的输入和存储运算因子超出了整型、实型能表示的范围,肯定不能直接用一个数的形式来表示。

在Pascal中,能表示多个数的数据类型有两种:数组和字符串。

二、运算过程(1)运算顺序:两个数靠右对齐;从低位向高位运算;先计算低位再计算高位;(2)运算规则:同一位的两个数相加再加上从低位来的进位,成为该位的和;这个和去掉向高位的进位就成为该位的值;如上例:3+8+1=12,向前一位进1,本位的值是2;可借助MOD、DIV运算完成这一步;(3)最后一位的进位:如果完成两个数的相加后,进位位值不为0,则应添加一位;(4)如果两个加数位数不一样多,则按位数多的一个进行计算;三、结果的输出按运算结果的实际位数输出四、优化:以上的方法的有明显的缺点:(1)浪费空间:一个整型变量(-32768~32767)只存放一位(0~9);(2)浪费时间:一次加减只处理一位;需求分析1.1问题描述C/C++语言中的int类型能表示的整数范围是−231~231−1,unsigned int类型能表示的整数范围是0~231−1,即0~4 294 967 295,所以,int 和unsigned int 类型都不能存储超过10位的整数。

《数据结构》课程设计报告-任意长的整数加减法运算

《数据结构》课程设计报告-任意长的整数加减法运算

中国石油大学(北京)远程教育学院《数据结构》课程设计报告2019 ~2019 学年第 1 学期课程设计题目第一题任意长的整数加减法运算2019 年8 月任意长的整数加减法运算1需求分析设计算法,实现一个任意长的整数进行加法、减法运算的演示程序。

例如:1234,5123,4512,3451,2345与-1111,1111,1111,1111,1111的加法结果为:0123,4012,3401,2340,1234。

基本要求如下:(1)利用链表实现长整数的存储,每个节点含一个整型变量;(2)整型变量的范围:-(2^15 -1)~(2^15 -1);(3)输入与输出形式每四位一组,组间用逗号分隔开。

如:1986,8213,1935,2736,3299;(4)界面友好,每步给出适当的操作提示,并且系统具有一定的容错能力。

至少给出下面的测试数据:(1)0;0(2)-2345,6789;-7654,3211(3)-9999,9999;1,0000,0000,0000(4)1,0001,0001;-1,0001,0001(5)1,0001,0001;-1,0001,0000(6)-9999,9999,9999;-9999,9999,9999(7)1,0000,9999,9999; 12概要设计注意这里是整数,浮点数需要额外的操作,实现大整数的加减,三个栈就OK了,两个运算整数栈,一个结果栈,基本的逻辑的就是利用栈的先入后出的特点将高位push到栈底,低位push到栈顶,之后两个栈pop出来之后push到结果栈,结果栈pop出来就是我们想要的结果。

typedef char ElemType;typedef struct{ElemType *base;ElemType *top;int stacksize;}sqStack;void initStack(sqStack *s)void Push(sqStack *s, ElemType e)void Pop(sqStack *s , ElemType *e)int StackLen(sqStack s)void ADD(sqStack *s1,sqStack *s2,sqStack *s3)3详细设计1. 主函数设计int main(){char e;sqStack s1,s2,s3;initStack(&s1); /*初始化堆栈s1,存放加数*/initStack(&s2); /*初始化堆栈s2,存放加数*/initStack(&s3); /*初始化堆栈s3,存放结果*/printf("江紫花090451\n"); /*输入第一个任意长整数,按”#”结尾*/printf("Please input the first integer\n"); /*输入第一个任意长整数,按”#”结尾*/scanf("%c",&e);while(e!='#'){Push(&s1,e); /*将加数(字符串)入栈s1*/scanf("%c",&e);}getchar(); /*接收回车符*/printf("Please input the second integer\n"); /*输入第二个任意长整数,按”#”结尾*/scanf("%c",&e);while(e!='#'){Push(&s2,e); /*将加数(字符串)入栈s2*/scanf("%c",&e);}ADD(&s1,&s2,&s3); /*加法运算,将结果存放在s3中*/printf("The result is\n");while(StackLen(s3)!=0) /*输出结果,打印在屏幕上*/{Pop(&s3,&e);printf("%c",e);}void initStack(sqStack *s){/*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s->base) exit(0); /*分配空间失败*/s->top = s->base; /*最开始,栈顶就是栈底*/s->stacksize = STACK_INIT_SIZE; /*最大容量为STACK_INIT_SIZE */ }/*入栈操作,将e压入栈中*/void Push(sqStack *s, ElemType e){if(s->top - s->base >= s->stacksize){/*栈满,追加空间*/s->base = (ElemType *)realloc(s->base, (s->stacksize +STACKINCREMENT)*sizeof(ElemType));if(!s->base) exit(0); /*存储分配失败*/s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/}*(s->top) = e; /*放入数据*/s->top++;}/*出栈操作,用e将栈顶元素返回*/void Pop(sqStack *s , ElemType *e){if(s->top == s->base) return;*e = *--(s->top);}/*计算堆栈s当前的长度*/int StackLen(sqStack s){return (s.top - s.base) ;}void ADD(sqStack *s1,sqStack *s2,sqStack *s3){char a1,a2,a3,c=0; /*a1,a2分别存放从堆栈s1,s2中取出的(数据)元素,a3=a1+a2,c中存放进位*/while(StackLen(*s1)!=0 && StackLen(*s2)!=0){Pop(s1,&a1); /*取出s1栈的栈顶元素给a1*/Pop(s2,&a2); /*取出s2栈的栈顶元素给a2*/a3 = (a1-48) + (a2-48) + c + 48; /*相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*将结果入栈s3*/}if(StackLen(*s1)!=0) /*栈s1不为空的情况*/{while(StackLen(*s1)!=0){Pop(s1,&a1); /*取出s1栈的栈顶元素给a1*/a3 = a1 + c ; /*与进位标志c相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*将结果入栈s3*/}}else if(StackLen(*s2)!=0) /*栈s1不为空的情况*/{while(StackLen(*s2)!=0){Pop(s2,&a2); /*取出s1栈的栈顶元素给a1*/a3 = a2 + c; /*与进位标志c相加*/if(a3>'9'){a3 = a3 - '9' + 47; /*产生进位的情况*/c = 1;}elsec = 0; /*不产生进位*/Push(s3,a3); /*栈s1不为空的情况*/}}if(c==1)Push(s3,'1'); /*如果最后有进位,将字符’1’入栈s3*/ }4程序测试(1)0;0(2)-2345,6789;-7654,3211(3)-9999,9999;1,0000,0000,0000(4)1,0001,0001;-1,0001,0001(5)1,0001,0001;-1,0001,0000(6)-9999,9999,9999;-9999,9999,9999(7)1,0000,9999,9999; 15感想与体会这是一门纯属于设计的科目,它需用把理论变为上机调试。

数据结构课程设计报告大数相乘与多项式相乘

数据结构课程设计报告大数相乘与多项式相乘

数据结构课程设计报告大数相乘与多项式相乘一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到数据的存储、组织和处理方法。

在本次课程设计报告中,我们将重点讨论大数相乘和多项式相乘两个问题,并给出相应的解决方案。

二、大数相乘1. 问题描述大数相乘是指两个超过计算机所能表示范围的整数相乘的问题。

在实际应用中,大数相乘时常浮现在密码学、数值计算和科学计算等领域。

2. 解决方案为了解决大数相乘的问题,我们可以采用分治算法。

具体步骤如下:- 将两个大数分别划分为高位和低位部份,例如将大数A划分为A1和A0,将大数B划分为B1和B0。

- 分别计算A1 * B1、A0 * B0和(A1 + A0) * (B1 + B0)的结果。

- 将上述三个结果通过适当的位移和加法运算得到最终的结果。

3. 算法实现下面是使用分治算法实现大数相乘的伪代码:```function multiply(A, B):if A 或者 B 是小数:直接返回 A * Belse:将 A 和 B 分别划分为高位和低位部份A1, A0 = 高位部份B1, B0 = 低位部份X = multiply(A1, B1)Y = multiply(A0, B0)Z = multiply(A1 + A0, B1 + B0)结果 = (X << n) + ((Z - X - Y) << n/2) + Y返回结果```4. 实例分析以A = 123456789 和 B = 987654321为例,我们可以通过上述算法得到它们的乘积为 121932631137021795。

三、多项式相乘1. 问题描述多项式相乘是指两个多项式相乘的问题。

在实际应用中,多项式相乘时常浮现在信号处理、图象处理和机器学习等领域。

2. 解决方案为了解决多项式相乘的问题,我们可以采用传统的乘法算法。

具体步骤如下:- 将两个多项式分别表示为系数和指数的形式,例如多项式A可以表示为A =a0x^0 + a1x^1 + ... + anx^n。

2长整数四则运算 数据结构课程设计[精品]

2长整数四则运算 数据结构课程设计[精品]

2长整数四则运算数据结构课程设计[精品] [实验名称]长整数四则运算[需求分析]设计一个实现任意长的整数进行减法运算的演示程序,要求完成长整数的加减运算,乘除运算可选做。

在这里长整数没有范围限制,可任意长。

运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。

测试数据:0、0; 输出“0”-7654,3211; 输出“1,0000,0000” 2345,6789、1,0000,0000,0000、9999,9999; 输出“9999,0000,0001”1,0001,0001、;1,0001,0001; 输出“0”自选数据:1,2345,6789; 9,8765,4321; 输出“11,1111,1110”[概要设计]数据结构利用双向循环链表来实现对长整数的存储。

每个节点只存储四位十进制数字,即不超过9999的非负整数。

双向链表有头指针,它的data值存储长整数的符号,1为正,-1为负,0代表长整数为0;它的over值存储除头节点外节点的个数。

其他节点的data值存储四位整数,over存储该四位整数溢出0~~9999范围的情况,一般over>0表示四位数超出9999,over<0表示四位数小于0。

选择该数据结构来完成长整数的加减运算是因为要对长整数进行运算,需要对长整数进行存储,所以选择用链表对长整数存储,又由于存储的顺序是从左到右,而运算的顺序则是从右到左,这样位了操作方便选择循环链表,在运算过程中有进位和借位的操作,所以最终选择双向循环链表的数据结构。

[详细设计]typedef struct DoubleNode //定义链表元素void InitNode(DLNode **head) //初始化链表int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素Xint digit(int n) //判断整数N有几位void PrintNode(DLNode *head) //打印链表void DestroyNode(DLNode **head)//销毁链表void add(DLNode *h1,DLNode *h2) //两数相加void jian(DLNode *h1,DLNode *h2) //两数相减int main() //入口函数[调试分析]调试过程中的困难:在数据的运算中,应为是根据数的大小来选择运算的,所以过程相对比较繁琐。

数据结构:长整数的加减法(任意长度的加减法)

数据结构:长整数的加减法(任意长度的加减法)

《数据结构》课程设计报告课程设计报告名称长整数的加法运算实验室实验楼502 完成日期 2018年11月30日}(2) 程序结构图(3) 功能模块3. 详细设计:1. 存储结构采用双向链表,使用头结点存放符号,后继节点存放其数字部分长整数的运算计算方式加法减法结果输入符号位数字部分输入两个长整数选择计算方式 加法模块 减法模块3.算法描述1.针对同号加法void Sub(DualList a, DualList b, DualList c)对两个链表的节点进行的最低位进行加法,默认都需要进位,超过10000的情况,会给在操作下一位的时候在加上进位数字1,如果没有发生进位那就加上进位数0void Add(DualList a, DualList b, DualList c){DualList pa, pb;int carry = 0, tmp;pa = a->prior;pb = b->prior;while((pa != a) && (pb != b)){tmp = pa->data + pb->data + carry;if (tmp >= 10000){carry = 1;tmp -= 10000;}elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;pb = pb->prior;}while(pa != a){// pb = btmp = pa->data + carry;if (tmp >= 1000){carry = 1;tmp -= 10000;}elsecarry = 0;InsertNodeAtHead(c, tmp);pa = pa->prior;}while(pb != b){// pa = atmp = pb->data + carry;if (tmp >= 1000)4. 调试分析:错误分析:.经常出现忘记符号终止符号,或大小写的小问题导致编译无法通过不安全的设计导致计算机崩溃(无图) 最后结果显示错误1.第一数字输入InputData()2.第2数字输入InputData()输入符号InitList()加入数字InsertNodeAtHead( L,data)加法DualList AddList( a, b)加减法选择同号Add()同号Sub()减法DualList SubList( a, b)结果PrintList(DualList L)正确测试结果:三、设计总结通这次实验让我充分认识到了自己所掌握程序设计知识的贫瘠,在长整的数字的运算之中,在一些数字的长度人可以接受的范围内我们通过用笔列算式、大脑的思考对两个较长的整数进行运算如果计算能力可以的话很快就能得出结果,整个运算的过程简单。

数据结构课程设计报告-长

数据结构课程设计报告-长

数据结构课程设计报告-长整数运算.数据结构课程设计报告题目:长整数四则运算一、需求分析1.问题描述:由于工程上有时候需要对很大的数进行计算,但是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,所以需要设计专门的算法对数据进行相应的计算。

此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。

程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。

2.基本功能功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。

功能二:将字符串转换成相应的数字存储在双向循环链表中功能三:对存入双向循环链表的长整数进行相加,相减,相除。

.3.输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。

输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。

二、概要设计1.设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。

将各部分的结果整合起来。

由于计算机固有的整数类型存数的对大整数是2^15-1,所以为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。

从最低位开始加法,超过一万向上进位,所以每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算可以借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。

2.数据结构设计:需要桉顺序因为计算的是一个连续的数字,一次计算,所以采用的数据结构的逻辑结构是线性表。

因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。

数据结构大型实验大整数运算系统附源代码

数据结构大型实验大整数运算系统附源代码

数据构造大型实验实验报告〔附源代码〕工业大学朱镇洋耀明华族目录第一局部要求与概述一、实验目的以及准备1.1.1 问题描述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.1.2 根本要求. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1.1.3 设计思路. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .第二局部具体实现一、代码局部2.1.1 链表类及大数类的局部说明以及局部源码. . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.2 局部简单函数功能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.3 加法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.4 减法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.5 乘法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.6 除法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.7 幂运算. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.1.8 二进制和十进制的相互转化. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .二、程序流程及函数间关系2.2.1 程序流程图. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.2.2 函数调用关系分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .三、实验验证分析2.3.1 输入的形式和输入值的围. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.3.2 输出的形式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.3.3 程序所能到达的功能. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .2.3.4 测试数据. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .四、调试分析2.4.1 调试过程中的主要技术问题以及具体的解决方法. . . . . . . . . . . . . . . . . . . . . . . .2.4.2 印象最深刻的3个调试错误,及修正方法. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .五、附录2.5.1 源代码及其所属文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .第一局部要求与概述1.1.1 问题描述•密码学分为两类密码:对称密码和非对称密码。

数据结构课程设计报告大数相乘与多项式相乘

数据结构课程设计报告大数相乘与多项式相乘

目录1、问题描述…………………………………………………2、设计思路…………………………………………………3、数据构造设计……………………………………………4、功能函数设计……………………………………………5、程序代码…………………………………………………6、运行与测试………………………………………………7、设计心得…………………………………………………一、大数相乘1、问题描述:<1>输入两个相对较大的正整数,能够通过程序计算出其结果2、设计思路:<1>首先考虑设计将两个大数按照输入顺序存入分别存入数a[ ],b[ ]中.<2>把这个数组中的每一位数字单独来进展乘法运算,比方我们可以用一个数字和另外一个数组中的每一位去相乘,从而得到乘法运算中一行的数字,再将每一行数字错位相加。

这就是乘法运算的过从低位往高位依次计算,同时确定每一列的项数,确定每一位上的结果存入数组c[ ]中.<3>找到最高位在数组中的项c[i],然后依次输出各位上的数值<4>通过主函数来调用其它各个函数。

3、数据构造设计:<1>输入阶段采用一维数组a[ ],b[ ]在输入阶段当大数输入时,大数a,b从高位到低位分别依次存入数组a[ ],b[ ]。

<2>调用函数计算阶段采用一维数组c[ ]在调用sum(a,b,m,n)函数中,在计算过程中,由个位到高位依次计算各位的结果,并依次存入数组c[ ]中。

4、功能函数设计:<1>找出每一列的所有项首先找规律,如下所示进展乘法:a[0] a[1] a[2]b[0] b[1] b[2]b[2]a[0] b[2]a[1] b[2]a[2]b[1]a[0] b[1]a[1] b[1]a[2]b[0]a[0] b[0]a[1] b[0]a[2]下标之和0 1 2 3 4i=4 i=3 i=2 i=1 i =0(循环时的i的数值)即有下标之和=m+n-2-i,由此限定条件可设计循环得出每一列的所有项。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

山东理工大学计算机学院课程设计(数据结构)班级姓名学号指导教师二○一二年一月十日课程设计任务书及成绩评定课题名称长整数的代数计算Ⅰ、题目的目的和要求:(1) 课程设计目的巩固和加深对数据结构的理解,通过上机实验、调试程序,加深对课本知识的理解,最终使学生能够熟练应用数据结构的知识写程序。

通过本课程的学习,能熟练掌握几种基本数据结构的基本操作,能够应用线性数据结构解决实际问题。

(2)基本要求:设计数据结构完成长整数的表示和存储,并编写算法来实现两长整数的加、减、乘除等基本代数运算。

①长整数长度在二十位以上。

②实现两长整数的加、减、乘、除操作。

选作:③输入输出均在文件中。

④分析算法的时空复杂性。

Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1] 严蔚敏数据结构(C语言版)清华大学出版社 1999[2] 严蔚敏数据结构题集(C语言版)清华大学出版社 1999[3] 谭浩强 C语言程序设计清华大学出版社[4] 与所用编程环境相配套的C语言或C++相关的资料Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○一二年一月十日目录第一章概述 (1)第二章系统分析 (2)第三章概要设计 (3)第四章详细设计 (4)第五章运行与测试 (14)第六章总结与心得 (16)参考文献 (15)第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

在这次程序设计中我选择了长整数的代数计算这个题目,在一般的程序运算中,长整数是无法计算的,因为计算机一次能够运算的位数是有限,一旦整数很长,就需要一个程序来进行多次计算,通过这个程序,可一把一个长整数分成多个普通整数来进行计算,使得长整数也可以进行运算。

我编写的这个程序就可以进行加减乘除的运算,各个数据也可以是负数。

第二章系统分析1、设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。

2、输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。

用lnode结点数据结构存储数据。

每一个数据有一个头结点,它的data域用来放数据的正负数。

其余结点的数都为正整数。

3、程序包含数据的输入,判断,运算,输出和主函数。

4、具体程序执行的命令包括:输入函数:inputa();inputb();//的输入并建立双向循环链表判断函数:compare();//比较数据的大小运算函数:unsigndeadd();//无符号的加法unsigndesub();//无符号的减法add();sub();mul();div();//加减乘除四则运算输出函数:divput();//除法结果的输出函数putoutc();//其余结果的输出函数主函数:main();第三章概要设计首先要考虑的是如何表示长整型数。

可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。

(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。

(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。

综上考虑,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。

(3)对于每一个长整型数可以设置一个头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的4位数的组数。

第一个存储4位数据组的结点称为首结点,而最后一个4位数据组结点称为尾结点。

为此需要结构数据类型:双向循环链表:typedef struct lnode{//结点结构体int data;struct lnode *next;struct lnode *prior;}lnode,*lnodelist主要的模块可分为输入函数:inputa();inputb();//的输入并建立双向循环链表判断函数:compare();//比较两个数据的大小,进行相应的的计算。

运算函数:add();sub();mul();div();//运算输出函数:divput();putoutc();//除法的输出及其他运算的输出。

主函数:main();第四章详细设计#include<iostream>using namespace std;#include<stdio.h>#define OK 1;#define FALSE 0;typedef struct lnode{//结点结构体int data;struct lnode *next;struct lnode *prior;}lnode,*lnodelist;int compare(lnodelist &ahead,lnodelist &bhead,int &q)//比较a和b的大小{lnode *pa,*pb;int bcount=0,acount=0;pa=ahead->next;pb=bhead->next;while(pa!=ahead){acount++;pa=pa->next;}while(pb!=bhead){bcount++;pb=pb->next;}if(acount>bcount)q=1;else if(acount<bcount)q=-1;else{pa=ahead->prior;pb=bhead->prior;while((pa->data==pb->data)&&(pa->prior!=ahead)){pa=pa->prior;pb=pb->prior;}if(pa->data>pb->data)q=1;else if(pa->data<pb->data)q=-1;else q=0;}return 0;}int inputa(lnodelist &ahead)//输入长整数a{lnode *p;char ch;int afirst;cout<<"请输入第一个无符号长整型数,要求每四位用逗号隔开末尾为分号:"<<endl;p=ahead=new lnode;//头结点p->data=0;p->next=p;p->prior=p;cin>>afirst>>ch;//输入第一个结点数据if(afirst<0){ahead->data=-1;afirst=-afirst;}else ahead->data=1;p=new lnode;p->data=afirst;p->next=ahead;ahead->prior=p;ahead->next=p;p->prior=ahead;while(ch!=';'){cin>>afirst>>ch;p=new lnode;p->data=afirst;p->next=ahead->next;ahead->next->prior=p;ahead->next=p;p->prior=ahead;}return OK;}int inputb(lnodelist &bhead)//输入长整数b{lnode *p;char ch;int bfirst;cout<<"请输入第二个无符号长整型数,要求每四位用逗号隔开末尾为分号:"<<endl;p=bhead=new lnode;//头结点p->data=0;p->next=p;cin>>bfirst>>ch;//输入第一个结点数据if(bfirst<0){bhead->data=-1;bfirst=-bfirst;}else bhead->data=1;p=new lnode;p->data=bfirst;p->next=bhead;bhead->prior=p;bhead->next=p;p->prior=bhead;while(ch!=';'){cin>>bfirst>>ch;p=new lnode;p->data=bfirst;p->next=bhead->next;bhead->next->prior=p;bhead->next=p;p->prior=bhead;}return OK;}void putoutc(lnode *chead)//输出结果{lnode *s,*pr;pr=chead->next;if(pr!=chead){cout<<pr->data;pr=pr->next;}while(pr!=chead){ if(pr->data==0)cout<<"0000";else if(pr->data>0&&pr->data<10)cout<<"000";else if(pr->data>=10&&pr->data<100)cout<<"00";else if(pr->data>=100&&pr->data<1000)cout<<"0";cout<<pr->data;s=pr;pr=pr->next;delete s;}cout<<endl;}int unsigndeadd(lnodelist &ahead,lnodelist &bhead)//无符号长整数的加法{int sum,carry=0; //进位lnode *pa,*pb;lnode *p,*chead;pa=ahead->next;pb=bhead->next;p=chead=new lnode;//头结点p->data=0;p->next=p;p->prior=p;while(pa!=ahead&&pb!=bhead){sum=pa->data+pb->data+carry;p=new lnode;p->data=sum%10000;carry = sum/10000;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;pa=pa->next;pb=pb->next;}if(pa!=ahead)//a还没有处理完,把a剩下的数字加到和上{while(pa!=ahead){sum=pa->data+carry;p=new lnode;p->data=sum%10000;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;carry = sum/10000;pa=pa->next;}}if(pb!=bhead)//b还没有处理完,把b剩下的数字加到和上{while(pb!=bhead){sum=pb->data+carry;p=new lnode;p->data=sum%10000;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;carry = sum/10000;pb=pb->next;}}if(carry)//如果最后一位有进位,就申请一个结点存储{p=new lnode;p->data=carry;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;}putoutc(chead);return OK;}int unsigndesub(lnodelist &ahead,lnodelist &bhead)//无符号长整数的减法a比b 大。

相关文档
最新文档