大整数的运算-数据结构课程设计
数据结构课程设计长整数四则运算

数据结构课程设计题目:长整数四则运算班级学号学生姓名提交日期成绩计算机与通信工程学院长整数四则运算一需求分析:问题描述:设计一个实现任意长的整数进行加法运算的演示程序。
基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的范围是 -(2^15 - 1) (2^15 - 1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
在现实生活中有很多地方,例如航空航海、生物医疗等等方面,都需要很大的数来表示,这些用int甚至长整型long long都是远不够的,所以需要有一种算法来解决这种大数的表示和运算。
该问题只要求了大数的相加运算。
二详细设计:大致思路:【存储】用两个链表,每个节点保存一位数,在链表头保存数的正负,正数保存1,负数保存-1,如果是正数,后面每一位都储存正数,负数每一位都储存负数,数字按照链表头到链表尾从高位到低位的顺序;【相加】从两个链表的尾部开始同步向前相加,加完存到第一个链表,第二个加完的结点销毁,会存在两个链表不一样长的情况,没加的直接连到链表的前面,最高位的符号存到链表的头;【调整】根据表头的符号,调整后面的数字的值,中间会产生进位或者退位的问题,各个节点的符号不一定相同,但对于正负数都可以建立同样的调整模式,将正负到tmp中(1或-1)加或者减(tmp*10),然后对前一位加或者减tmp*1即可。
第一位保留符号不变,这样不用处理多余的进位,也就不用再产生新的节点,也不用保存符号。
【输出】从前到后遍历已经处理好的表,将每一位进行输出就可以了。
结构体定义struct Node{Node *pre;Node *next;int data;};功能函数void Input(Node *p,Node *t)//处理输入和保存void disply(Node *h,Node *t,int l)//输出void add(Node *h1,Node *t1,Node *h2,Node *t2)//每一位相加int adjust(Node *h,Node *t)//将各个位的正负、大小、进位进行调整源程序:。
数据结构课程设计长整数加减运算

课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长。
正确处理好运算之后的进位和借位。
(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)0; 0;输出“0”;(2)-2345,6789; -7654,3211;输出“-1,000,000”;(3)-9999,9999; 1,0000,0000,0000;输出“9999,0000,0001”; (4)1,0001,0001; -1,0001,0001;输出“0”;(5)1,0001,0001; -1,0001,0001;输出“1”;(6)-9999,9999,9999;-9999,9999,9999;输出“-1,9999,9999,9998”; (7)1,0000,9999,9999; 1;输出"1,0001,0000,0000".二、概要设计为实现上述程序功能,应以双向循环链表表示长整数。
为此,需要定义一个抽象数据类型。
1.抽象数据类型定义为:ADT OrderedList{数据对象:D={ai|ai∈int,i=1,2,...n, n≥0}基本操作:init(&a,digit4)操作结果:构造一个位数是digit4*4长整数。
pass(&a,&b,&c)初始条件:a,b,c都已存在操作结果:c等于a和b的和。
nep(&a)初始条件:a已存在。
操作结果:a变为输入参数的相反数。
printlong(&a)初始条件:a已存在。
操作结果:按四位一组,分隔符为","的格式,在屏幕上输出a。
毕业设计-设计并实现大整数(超过十位的整数)的加减乘除运算

目录第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。
大整数地运算大数据结构课程设计

目录一、题目概述(内容及要求) (2)二、功能分析 (2)三、设计 (3)四、运行与测试 (4)五、总结 (21)六、参考文献 (21)一、题目概述(内容及要求)内容:请设计一个有效的算法,可以进行两个n位大整数的四则运算。
①长整数长度在二十位以上。
②实现两长整数的加、减、乘、除操作。
要求:1.设计数据结构,存储结构;2.在c兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.软件运行,给出测试数据。
二、功能分析1.设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。
2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。
用lnode结点数据结构存储数据。
每一个数据有一个头结点,它的data域用来放数据的正负数。
其余结点的数都为正整数。
3.程序包含数据的输入,判断,运算,输出和主函数。
4.具体程序执行的命令包括:a)输入函数:inputa();inputb();//的输入并建立双向循环链表b)判断函数:compare();//比较数据的大小c)运算函数:unsigndeadd();//无符号的加法a)unsigndesub();//无符号的减法b)add();sub();mul();div();//加减乘除四则运算d)输出函数:divput();//除法结果的输出函数a)putoutc();//其余结果的输出函数e)主函数:main();5.系统功能结构框图图2.1 系统功能结构框图三、设计首先要考虑的是如何表示长整型数。
可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。
(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。
(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、题目概述(内容及要求) (2)二、功能分析 (2)三、设计 (3)四、运行与测试 (4)五、总结 (21)六、参考文献 (21)一、题目概述(内容及要求)内容:请设计一个有效的算法,可以进行两个n位大整数的四则运算。
①长整数长度在二十位以上。
②实现两长整数的加、减、乘、除操作。
要求:1.设计数据结构,存储结构;2.在c兼容环境完成上述题目的代码编写与调试;3.程序运行界面交互性好;4.软件运行,给出测试数据。
二、功能分析1.设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。
2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。
用lnode结点数据结构存储数据。
每一个数据有一个头结点,它的data域用来放数据的正负数。
其余结点的数都为正整数。
3.程序包含数据的输入,判断,运算,输出和主函数。
4.具体程序执行的命令包括:a)输入函数:inputa();inputb();//的输入并建立双向循环链表b)判断函数:compare();//比较数据的大小c)运算函数:unsigndeadd();//无符号的加法a)unsigndesub();//无符号的减法b)add();sub();mul();div();//加减乘除四则运算d)输出函数:divput();//除法结果的输出函数a)putoutc();//其余结果的输出函数e)主函数:main();5.系统功能结构框图图2.1 系统功能结构框图三、设计首先要考虑的是如何表示长整型数。
可以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();四、运行与测试图4.1长整数加法运行结果图实现以上加法操作的程序如下:int add(lnodelist &ahead,lnodelist &bhead){int e,acount=0,bcount=0,q;e=ahead->data*bhead->data;cout<<"输出运算结果为:"<<endl;if(e==1){if(ahead->data==-1){cout<<"-";unsigndeadd(ahead,bhead);}else unsigndeadd(ahead,bhead);}else{compare(ahead,bhead,q);if(q==1){if(ahead->data==-1){cout<<"-";unsigndesub(ahead,bhead);}else unsigndesub(ahead,bhead);}else{if(ahead->data==1){cout<<"-";unsigndesub(bhead,ahead);}else unsigndesub(bhead,ahead);}}return 0;}图4.2长整数减法运行结果图实现以上减法操作的程序如下:int sub(lnodelist &ahead,lnodelist &bhead){int e,q;e=ahead->data*bhead->data;cout<<"输出运算结果为:"<<endl;if(e==-1){if(ahead->data==-1){cout<<"-";unsigndeadd(ahead,bhead);}else{unsigndeadd(ahead,bhead);}}else{compare(ahead,bhead,q);if(q==1){if(ahead->data==-1){cout<<"-";unsigndesub(ahead,bhead);}else unsigndesub(ahead,bhead);}else{if(ahead->data==1){cout<<"-";unsigndesub(bhead,ahead);}else unsigndesub(bhead,ahead);}}return 0;}图4.3长整数乘法运行结果图实现以上乘法操作的程序如下:int mul(lnodelist &ahead,lnodelist &bhead){long multi,carry; //进位int e;lnode *pa,*pb,*pc,*cnow;lnode *p,*chead;e=ahead->data*bhead->data;cout<<"输出运算结果为:"<<endl;if(e==-1){cout<<"-";}pa=ahead->next;pb=bhead->next;p=chead=new lnode;//头结点p->data=0;p->next=p;p->prior=p;pc=cnow=chead;while(pb!=bhead){carry=0;while(pa!=ahead){multi=pa->data*pb->data+carry;carry = multi/10000;if(pc->prior==chead){p=new lnode;p->data=multi%10000;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;}else{multi=pc->prior->data+multi%10000;pc->prior->data=multi%10000;carry=carry+multi/10000;}pc=pc->prior;pa=pa->next;}if(carry!=0){p=new lnode;p->data=carry;p->next=chead->next;chead->next->prior=p;chead->next=p;p->prior=chead;}cnow=cnow->prior;pc=cnow;pa=ahead->next;pb=pb->next;}putoutc(chead);return OK;}图4.4长整数除法运行结果图实现以上除法操作的程序如下:int divput(lnode *chead){lnode *s,*pr;pr=chead->prior;if(pr!=chead){ cout<<pr->data;pr=pr->prior;}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->prior;delete s;}cout<<endl;return 0;}int div(lnodelist &ahead,lnodelist &bhead){cout<<"输出运算结果为:"<<endl;lnode *pa,*pb,*s,*p;int borrow=0,diffe,count=0,q,acount=0,bcount=0,e; //借位e=ahead->data*bhead->data;cout<<"输出运算结果为:"<<endl;cout<<"商为"; if(e==-1){cout<<"-";}while(borrow==0){compare(ahead,bhead,q);if(q==0){borrow=1;cout<<++count<<",余数为0"<<endl;}else if(q==-1){borrow=1;cout<<count<<",余数为";divput(ahead);}else{count=count+1;pa=ahead->next;pb=bhead->next;while(pa!=ahead&&pb!=bhead){diffe=pa->data-borrow-pb->data;if(diffe<0){borrow=1;diffe=diffe+10000;}else borrow=0;pa->data=diffe;pa = pa->next;pb = pb->next;}if(pa!=ahead){while(pa!=ahead){diffe=pa->data-borrow;if (diffe<0){borrow=1;diffe+=10000;}else borrow=0;pa->data=diffe;pa=pa->next;}}p=pa->prior;while(p->data==0&&p->prior!=ahead){s=p;p=p->prior;ahead->prior=p;p->next=ahead;delete s;}}}return 0;}附录(其它代码实现):第一部分:#include<iostream>using namespace std;#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大。