两个任意长整数相加
- 格式:doc
- 大小:677.50 KB
- 文档页数:32
整数的加法与减法1.概念:加法是数学中的一种基本运算,将两个数合并成一个数的运算。
2.计算法则:a)正数加正数,结果为正数,绝对值相加;b)负数加负数,结果为负数,绝对值相加;c)正数加负数,结果的符号由绝对值大的数决定,绝对值相加;d)加零,结果为原数。
3.加法的运算性质:a)交换律:加数的位置交换,和不变;b)结合律:三个或三个以上的数相加,可以任意改变加数的组合方式,和不变。
4.概念:减法是数学中的一种基本运算,已知两个加数的和与其中的一个加数,求另一个加数的运算。
5.计算法则:a)正数减正数,结果为负数,绝对值相减;b)负数减负数,结果为负数,绝对值相减,并改变符号;c)正数减负数,结果为正数,绝对值相减;d)减零,结果为原数。
6.减法的运算性质:a)交换律:减数与被减数的位置交换,差不变;b)结合律:三个或三个以上的数相减,可以任意改变减数的组合方式,差不变。
三、加减法的运算规则1.同级运算,从左到右依次进行;2.两级运算,先算高级运算,再算低级运算;3.同一级运算,可以按照运算顺序自由组合。
4.计算简单的加减法题目;5.解决实际生活中的加减法问题,如购物、计算距离等;6.运用加减法运算解决更复杂的数学问题,如四则运算、方程等。
五、注意事项1.运算过程中,注意符号的运用,特别是正负号;2.运算过程中,可以借助计算器,但要学会检查结果的正确性;3.遇到复杂问题时,可以先画图帮助理解问题,再进行计算。
习题及方法:1.习题:计算23 + 17。
答案:40。
解题思路:直接按照加法的计算法则,将两个数相加即可得到结果。
2.习题:计算15 - 8。
解题思路:直接按照减法的计算法则,将两个数相减即可得到结果。
3.习题:计算36 + 24。
答案:60。
解题思路:直接按照加法的计算法则,将两个数相加即可得到结果。
4.习题:计算80 - 50。
答案:30。
解题思路:直接按照减法的计算法则,将两个数相减即可得到结果。
整数的概念和运算法则整数是数学中的一个重要概念,广泛应用于各个领域。
在我们的日常生活中,整数也扮演着重要的角色。
本文将介绍整数的概念以及整数的运算法则,帮助读者更好地理解和运用整数。
一、整数的概念整数是由自然数、负自然数和零构成的数集。
自然数是从1开始的正整数,负自然数是从-1开始的负整数,而0则是不大不小的整数。
整数集合可以表示为{..., -3, -2, -1, 0, 1, 2, 3, ...}。
整数是没有小数部分的数,它可以用于计数、度量、排列等各种场合。
整数有一些重要的性质。
首先,整数的绝对值是非负的,即整数的绝对值要么是0,要么是一个正整数。
其次,整数具有封闭性,即两个整数相加或相乘的结果仍然是一个整数。
另外,整数的相反数也是一个整数,两个整数的和等于它们的相反数的差。
二、整数的运算法则1. 整数的加法与减法整数的加法遵循交换律和结合律。
即对于任意整数a、b和c,有以下运算法则:- 交换律:a + b = b + a- 结合律:(a + b) + c = a + (b + c)整数的减法可以转化为加法运算。
即减去一个整数可以看作是加上它的相反数。
例如,a - b可以写作a + (-b)。
2. 整数的乘法和除法整数的乘法也遵循交换律和结合律。
即对于任意整数a、b和c,有以下运算法则:- 交换律:a × b = b × a- 结合律:(a × b) × c = a × (b × c)整数的除法要注意的是,除数不可以为0。
除法的结果可以是整数,也可以是带有小数部分的分数。
3. 整数的乘方整数的乘方是指将一个整数自乘多次的运算。
整数的乘方满足以下法则:- a的n次方(a^n)表示将a连乘n次,其中n为正整数。
例如,2的3次方等于2 × 2 × 2 = 8。
4. 整数的升幂和降幂整数的升幂表示从小到大按顺序连乘的运算,降幂表示从大到小按顺序连乘的运算。
长整数四则运算题目:编制一个演示长整数的四则运算的程序一、需求分析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{2.数据对象: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已存在。
m与n的数学运算描述用户输入两个数m和n其中n是整数计算m和n的5种数学运算结果1.加法运算加法运算是指将m和n相加得到的结果。
用户输入的m和n可以是任意数值,可以是正数、负数或零。
当两个数相加时,如果m和n都是正数,则结果为两个数的和;如果m和n都是负数,则结果为两个数的和的负数;如果m和n符号不同,则结果的符号取决于绝对值较大的数;如果m和n有一个为零,则结果为另一个数本身。
例如,用户输入m为3,n为5,则m与n的加法运算结果为82.减法运算减法运算是指将m和n相减得到的结果。
同样,m和n的符号可以是正数、负数或零。
当两个数相减时,可以分为以下几种情况:如果m和n都是正数,则结果为两个数相减的差;如果m和n都是负数,则结果为两个数相减的差的负数;如果m和n符号不同,则结果的符号取决于绝对值较大的数;如果m和n有一个为零,则结果为另一个数本身。
例如,用户输入m为7,n为3,则m与n的减法运算结果为43.乘法运算乘法运算是指将m和n相乘得到的结果。
同样,m和n可以是正数、负数或零。
当两个数相乘时,结果的符号取决于m和n的符号,如果m和n的符号相同,则结果为正数;如果m和n的符号不同,则结果为负数;如果m和n中有一个为零,则结果为零。
例如,用户输入m为2,n为4,则m与n的乘法运算结果为84.除法运算除法运算是指将m除以n得到的结果。
在除法运算中,n必须是一个非零的整数。
当两个数相除时,可以分为以下几种情况:如果m和n符号相同,则结果为正数;如果m和n的符号不同,则结果为负数;如果m为零,则结果为零。
除法运算中,如果m不能被n整除,结果将包含小数部分。
例如,用户输入m为9,n为2,则m与n的除法运算结果为4.55.求模运算求模运算是指将m对n取模得到的结果。
在求模运算中,n必须是一个非零的整数。
当两个数进行求模运算时,结果的符号与m的符号相同。
例如,用户输入m为10,n为3,则m与n的求模运算结果为1总结:通过以上五种数学运算,我们可以对用户输入的m和n进行运算,并得到相应的结果。
目录摘要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域保存数的正负。
软件综合课程设计两个任意长的整数的求和运算进制的转换2014 年6月目录一、问题陈述二、需求分析三、概要设计四、详细设计五、程序代码六、运行结果与测试七、设计体会与总结两个任意长的整数的求和运算一、问题陈述设计一个程序实现两个任意长的整数的求和运算。
利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。
要求输入和输出每四位一组,组间用逗号隔开。
如:1,0000,0000,0000,0000。
二、需求分析1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。
3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以#结束,每四位一组。
三、概要设计在此说明数据结构设计和关键的算法设计思想Add()函数是实现该问题的主要函数即相加。
typedef struct et 定义双循环链表的存储结构.void setin(dtp *a) 读入数据存储在双链表中的函数;void print1(dtp *w,int len) 原样输出输入的数,略去结束符"#";void print2(dtp a,int len) 输出运算结果,以每四位一个","样式;四、详细设计程序流程图五、程序代码#include<iostream>using namespace std;#define null 0typedef struct et {int data;struct et * pr,* next;} dtp;void setin(dtp *a) {t= new dtp;t->data=k;w=w+1;if(c->next)c->next->pr=t;t->next=c->next;c->next=t;t->pr=c;}*len=w;}void print1(dtp *w,int len)'#'表示输入结束: "<<endl;cout<<"请输入第一个数a: "<<endl;setin(&la);cout<<"请输入第二个数b: "<<endl;setin(&lb);add (la,lb,&lc,&length);cout<<"你输入的两个数的和为: ";cout<<endl<<" ";print1 (&la,length);cout<<"+ ";print1 (&lb,length);cout<<"---------------";cout<<endl<<" ";print2(lc,length);for(;2;){cin>>ma;if (ma=='\n')continue ;else break;}}}六、运行结果与测试进制的转换一、问题陈述任意给定一个M进制的数x ,请实现如下要求1)求出此数x的10进制值(用MD表示)2)实现对x向任意的一个非M进制的数的转换。
计算机基本运算计算机是一种能够进行高速数值计算和逻辑运算的先进设备,它的基本运算是实现计算和处理信息的重要手段。
计算机的基本运算涉及到数学运算、逻辑运算和数据处理等多个方面,在计算机科学领域具有重要的意义。
本文将从数学运算、逻辑运算和数据处理三个方面来探讨计算机的基本运算。
一、数学运算数学运算是计算机最基本的运算之一,它包括加法、减法、乘法、除法等基本运算。
计算机通过内部的算术逻辑单元(ALU)来实现这些基本运算。
1. 加法运算加法是计算机最常见的数学运算之一,计算机能够实现任意长度的整数和小数的加法运算。
当进行加法运算时,计算机将两个数的位表示进行相加,并考虑进位的情况,得到最终的结果。
2. 减法运算减法是计算机中另一个常见的数学运算,计算机能够实现任意长度的整数和小数的减法运算。
计算机通过将被减数的位表示与减数的位表示进行相减,并考虑借位的情况,得到最终的结果。
3. 乘法运算乘法是计算机中的一种复杂数学运算,计算机能够实现任意长度的整数和小数的乘法运算。
计算机通过将两个数的位表示进行相乘,并根据乘法的规则得到最终的结果。
4. 除法运算除法是计算机中的一种复杂数学运算,计算机能够实现任意长度的整数和小数的除法运算。
计算机通过将被除数的位表示与除数的位表示进行相除,并根据除法的规则得到最终的商和余数。
二、逻辑运算逻辑运算是计算机中的另一类基本运算,它包括与、或、非、异或等逻辑运算。
逻辑运算在计算机的逻辑电路中起到重要的作用。
1. 与运算与运算是逻辑运算中的一种,计算机通过对两个输入值进行比较,只有当两个输入值同时为真时,输出值才为真。
2. 或运算或运算是逻辑运算中的一种,计算机通过对两个输入值进行比较,只要其中一个输入值为真,输出值就为真。
3. 非运算非运算是逻辑运算中的一种,计算机通过对输入值进行取反操作,当输入值为真时,输出值为假;当输入值为假时,输出值为真。
4. 异或运算异或运算是逻辑运算中的一种,计算机通过对两个输入值进行比较,只有当两个输入值不相同时,输出值才为真。
整数加减法运算定律
整数加减法运算定律是指对于任意两个整数a 和b,它们的和与差都有一定的规律,具体如下:
1. 加法结合律:对于任意三个整数a、b 和c,它们的和满足:(a + b) + c = a + (b + c)。
即无论先计算哪两个数的和,然后再与第三个数相加,结果都是相同的。
2. 减法结合律:对于任意三个整数a、b 和c,它们的差满足:(a - b) - c = a - (b + c)。
即无论先计算哪两个数的差,然后再从第三个数中减去,结果都是相同的。
3. 加法交换律:对于任意两个整数a 和b,它们的和满足:a + b = b + a。
即交换两个数的位置,结果不变。
4. 减法的交换律不存在:对于任意两个整数a 和b,它们的差并不满足:a - b = b - a。
即交换两个数的位置,结果会改变。
5. 加法和减法的结合律:对于任意三个整数a、b 和c,它们的和减去一个数的差满足:(a + b) - c = a + (b - c)。
即在计算和与差的混合运算时,先计算加法,再进行减法,结果与直接计算不同的只有差的符号。
总之,这些定律可以帮助我们更加方便、快捷地计算整数的加减。
【例2.5】假设有n(n>1)个线性表顺序地存放在顺序表S[1..m]中,令F[i]和R[i]指示第i个(1≤i≤n)表的第1个元素和最后1个元素在S中的位置,并设定R[i]<F[i+1],F[n+1]=m+1,如图2.2所示。
试写出实现下列要求的算法:(1)在第i个表中的第j项后面插入1个元素,仅当整个[1..m]空间填满时,不允许进行插入操作。
(2)删除第i个表中的第j个元素,要求在删除第j个元素后,该表仍为顺序存储的线性表。
【解】本题实质上是将n个线性表(长度可能不相同)放在一个连续空间(长度为m),来解决这些线性表的插入和删除问题。
(1)的算法如下:void ins(i,j,x){int p,k;if (R[n]==m)cout << "上溢" << endl;else{for (p=n;p>=i+1;p--) //将i+1到n的线性表后移一个元素{for (k=R[p];k>=F[p];k--) //将第p个线性表后移一个元素S[k+1]=S[k];R[p]++;F[p]++; //第p个线性表的首尾元素位置均增1}for (p=R[i];p>=j+1;p--)//将第i个线性表中的第j个位置起的元素均后移S[p+1]=S[p];S[p]=x; //在第i个线性表的第j个位置处存放xR[p]++; //第p个线性表的R[p]增1}}(2)的算法如下:void del(i,j){for (p=F[i]+j-1;p<=m;p++) //元素前移覆盖要删除的元素S[p]=S[p+1];for (p=i;p<=n;p++) //第i个及以后的线性表的R[i]值减1R[p]--;for (p=i+1;p<=n;p++) //第i+1个及以后的线性表的F[i]值减1F[p]--;}【例2.6】设A=(a1,a2,⋯,a m)和B=(b1,b2,⋯,b n)均为顺序表。
课程设计报告福建农林大学计算机与信息学院计算机类课程设计结果评定目录一、概要设计 (5)1.1编写目的 (5)1.2背景 (5)1.3任务概述 (5)1.4 功能性需求 (5)1.5运行环境 (5)1.6基本功能描述 (6)1.7 运行设计 (7)1.7.1运行模块组合 (7)1.8程序总体性能及运行环境要求 (8)1.8.1 运行环境要求 (8)二.详细设计 (8)2求和运算的伪代码算法 (8)3模块 (19)3.1 系统模块N-S图 (19)三、需求分析 (23)3.1功能规定 (23)3.2用户管理 (25)3.3操作方式 (25)3.4运行环境 (25)3.5输入输出要求 (25)3.51输入的操作要求 (25)3.6故障处理要求 (26)3.7其他专门要求 (27)3.8可扩充性 (27)3.9运行环境规定 (27)设备 (27)用户程序硬件要求 (27)服务器硬件需求 (27)支持软件 (27)用户程序软件 (27)程序设计开发软件 (27)四.调试分析 (28)4.1.程序调试与测试 (28)调试过程 (28)4.2.测试结果 (29)结果分析 (29)正确的结果: (30)错误的结果 (30)算法的时间复杂度 (31)五、用户使用说明 (31)六.总结 (31)七.参考文献 (32)附件四:课程设计报告正文格式一、概要设计1.1编写目的本说明书是为了任意的整数加法运算而编写,主要面向程序分析员、程序员、测试员、实施员和最终用户。
本说明书是整个算法思想的依据,它对以后阶段的工作起指导作用。
本文也是项目完成后实验验收的依据。
1.2背景本程序实现计算任意长的整数的加法运算.我们用到双向链表,在建立链表,插入,删除等运算中,充分利用链表的思想,结合实际编写这个运算。
1.3任务概述每个人分配一些任务,自行完成,在结合我们写出的代码,运行下没有什么错误,利用编写完的代码划分模块,在我们建立类的模块下,划分出不同模块。
1.4 功能性需求功能划分从程序实现的主要功能来分析,大致可以分为五大部分,即主程序模块、双向链表的建立对双向链表的插入、删除、双向链表的输入输出数据、两个数的相加运算。
1.5运行环境硬件:(1)学生用微机(2)多媒体教室或远程教学(3)局域网环境软件:(1)Windows XP中文操作系统(2)Turbo C 3.0或Microsoft V isual C++ 6.01.6基本功能描述为实现上述程序功能,应以双向循环链表表示长整数。
1.7 运行设计1.7.1运行模块组合说明对程序施加不同的外界运行控制时所引起的各种不同的运行模块组合,说明每种运行所历经的内部模块。
1.7.2运行控制进入双向链表的主函数选择功能模块: 双向链表的建立,对数据的插入删除, 输入输出数据, 两个整数相加结束程序运行1.7.3运行时间本程序的各个模块之间功能是相互联系的,故各模块占用各种资源的时间是累计的,所以运行时间由用户的操作和网络的运行速度决定。
1.8程序总体性能及运行环境要求1.8.1 运行环境要求●开发软件用的是Microsoft Visual C++ 6.0●客户端采用WINDOWXP或WINDOW系统。
1.8.2 开发工具要求●开发语言采用C++ Builder1.8.3 性能要求●程序的先进性:应采用算法的先进行性。
●程序的健壮性: 程序应该保证其健壮性,保证出错得概率尽可能的低。
●操作的简便性:考虑到程序的实际工作环境,程序的操作应尽量简单对一般错误,给用户提示信息,让用户重新输入或退出。
二.详细设计2求和运算的伪代码算法//双向链表的结构体定义typedef struct Node{int data;struct Node *prior;struct Node *next;}DLNode;//双向链表的初始化void ListInitiate(DLNode **head){*head=(DLNode *)malloc(sizeof(DLNode));(*head)->prior=*head;(*head)->next=*head;}//双向链表的表长int ListLength(DLNode *L){DLNode *p=L;int len=0;while(p->next!=L){p=p->next;len++;}return len;}//双向链表中插入数据int ListInsert(DLNode *L,int i,int x)//i表示要插入的位置,x表示要插入的值{DLNode *p,*s;int j;p=L->next;j=0;while(p!=L&&j<i){p=p->next;j++;}if(j!=i){cout<<"\n插入位置不合法!"<<endl;return 0;}s=new DLNode ;//为节点申请空间s->data=x;//为节点赋值s->prior=p->prior;//在正确的位置插入节点p->prior->next=s;s->next=p;p->prior=s;return 1;}//删除双向链表中的数据int ListDelete(DLNode *L,int i,int *x)//i表示要删除的位置,*X用来保存要删除的那个节点的值{DLNode *p;int j;p=L->next;j=0;while(p->next!=L&&j<i)//查找第i个位置的节点{p=p->next;j++;}if(j!=i){cout<<"\n删除位置不合法!"<<endl;return 0;}p->prior->next=p->next;//删除第i个位置的节点p->next->prior=p->prior;*x=p->data;//保存删除节点的值delete p;//释放空间return 1;}//输入的数据int InputNumber(DLNode *L){int input,i=0;//i表示第i个节点char c;//读入数据时,用0表示负数,1表示正数cin>>input>>c;while(1){if(input<0&&i==0)//输入数为负且是第一个节点{L->data=0;//将长整数的符号保存在头结点中input=fabs(input);//取输入数字的绝对值ListInsert(L,i,input);//插入数据}else if(input>=0&&i==0)//输入数为正且是第一个节点 {L->data=1;//将长整数的符号保存在头结点中ListInsert(L,i,input);//插入数据}else{ListInsert(L,i,input);//不是第一个节点}i++;if(c==',') break;//输入逗号,跳出循环 cin>>input>>c;}return 1;}//输出数据void OutputNumber(DLNode *L,int sign) {DLNode *r=L->prior;if(sign==1)//输出结果的正负{printf("The result is :");}else{printf("The result is : -");}printf("%d",r->data);r=r->prior;while(r!=L)//控制输出的格式{if(r->data<10){printf(",000");printf("%d",r->data);}else if(r->data<100){printf(",00");printf("%d",r->data);}else if(r->data<1000){printf(",0");printf("%d",r->data);}else{printf(",%d",r->data);}r=r->prior;}printf("\n");}//任意两个整数的加运算int Add(DLNode *L1,DLNode *L2,DLNode *L3){int data;int i=0;int length1,length2;int longer;//用于标记在异号情况下哪个整数的位数一个更长些int carry=0;//标记进位int borrow=0;//标记借位DLNode *p=L1->next,*q=L2->next,*l3=L3->prior,*notsame; //两个数为异号时的加法运算if(L1->data!=L2->data){i=0;length1=ListLength(L1);length2=ListLength(L2);//结点个数相同的情况if(length1==length2){//找出p和q中第一个数据不相同的节点while(p!=L1)//循环整个链表{if(p->data>q->data)//p的值大于q的值{longer=1;notsame=p->prior;break;}else if(p->data<q->data)//q的值大于的p值{longer=2;notsame=q->prior;break;}else//;{p=p->next;q=q->next;}}//进入下一步的判断if(p==L1)//一直到了表尾还是相同,则说明这两个数相同{printf("The result is : 0\n");return 0;}else if(longer==1)//p的值大于q的值{while(p->next!=L1) p=p->next;//将链表的当前指针指到表尾 while(q->next!=L2) q=q->next;//将链表的当前指针指到表尾 //将p和q相应节点上的数相减while(p!=notsame)//循环整个链表{data=p->data-q->data+borrow;borrow=0;if(data<0)//相减后小于零借位{data+=10000;borrow=-1;}ListInsert(L3,i,data);//将运算完的结构插入链表L3i++;p=p->prior;q=q->prior;}OutputNumber(L3,L1->data);}else if(longer==2)//q的值大于p的值{while(p->next!=L1) p=p->next;//将链表的当前指针指到表尾 while(q->next!=L2) q=q->next;//将链表的当前指针指到表尾 //将p和q相应节点上的数相减while(q!=notsame)//循环整个链表{data=q->data-p->data+borrow;borrow=0;if(data<0)//相减后小于零借位{data+=10000;borrow=-1;}ListInsert(L3,i,data);//将运算完的结构插入链表L3i++;p=p->prior;q=q->prior;}}}else if(length1>length2)//第一个链表比第二个链表长{while(p->next!=L1) p=p->next;//将链表的当前指针指到表尾 while(q->next!=L2) q=q->next;//将链表的当前指针指到表尾 while(q!=L2)//循环整个链表{data=p->data-q->data+borrow;borrow=0;if(data<0)//相减完如果小于零借位{data+=10000;borrow=-1;}ListInsert(L3,i,data);//将运算完的结构插入链表L3i++;p=p->prior;q=q->prior;}while(p!=L1)//循环整个链表{data=p->data+borrow;borrow=0;if(data<0)//相减完如果小于零借位{data+=10000;borrow=-1;}if(p==L1->next){if(data!=0){ListInsert(L3,i,data);//将运算完的结构插入链表L3}}else{ListInsert(L3,i,data);//将运算完的结构插入链表L3}p=p->prior;i++;}}else if(length1<length2)//第一个链表比第二个链表短{while(p->next!=L1) p=p->next;//将链表的当前指针指到表尾 while(q->next!=L2) q=q->next;//将链表的当前指针指到表尾 while(p!=L1)//循环整个链表{data=q->data-p->data+borrow;borrow=0;if(data<0)//相减完如果小于零借位{data+=10000;borrow=-1;}ListInsert(L3,i,data);i++;p=p->prior;q=q->prior;}while(q!=L2)//循环整个链表{data=q->data+borrow;borrow=0;if(data<0)//相减完如果小于零借位{data+=10000;borrow=-1;}if(q==L2->next){if(data!=0){ListInsert(L3,i,data);//将运算完的结构插入链表L3}}else{ListInsert(L3,i,data);//将运算完的结构插入链表L3}q=q->prior;i++;}OutputNumber(L3,L2->data);}}//两个数为同号时的加法运算else{while(p->next!=L1) p=p->next;//将链表的当前指针指到表尾 while(q->next!=L2) q=q->next;//将链表的当前指针指到表尾while(p!=L1&&q!=L2){data=p->data+q->data+carry;carry=0;if(data>9999)//相加后超过9999,则进位{carry=data/10000;data%=10000;}ListInsert(L3,i,data);i++;p=p->prior;q=q->prior;}if(p==L1&&q==L2)//节点数相同的情况下{if(carry!=0)//最高位有进位{ListInsert(L3,i,carry);carry=0;i++;}OutputNumber(L3,L1->data);}else if(p==L1)//q的长度大于p的长度{if(carry!=0)//有进位{while(q!=L2){data=q->data+carry;carry=0;if(data>9999)//相加后超过9999,则进位{carry=data/10000;data%=10000;}ListInsert(L3,i,data);//将运算完的结果插入链表L3i++;q=q->prior;}if(carry!=0)//最高位有进位{ListInsert(L3,i,carry);carry=0;i++;}OutputNumber(L3,L2->data);}else//无进位的情况{while(q!=L2){ListInsert(L3,i,q->data);//将运算完的结果插入链表L3 i++;q=q->prior;}OutputNumber(L3,L2->data);}}else//p的长度大于q的长度{if(carry!=0){while(p!=L1)//相加后超过9999,则进位{data=p->data+carry;carry=0;if(data>9999){carry=data/10000;data%=10000;}ListInsert(L3,i,data);//将运算完的结果插入链表L3i++;p=p->prior;}if(carry!=0)//最高位有进位{ListInsert(L3,i,carry);carry=0;i++;}OutputNumber(L3,L1->data);}else//没有进位{while(p!=L1){ListInsert(L3,i,p->data);//将运算完的结果插入链表L3 i++;p=p->prior;}OutputNumber(L3,L1->data);}}}return 1;}//主函数void main(){char ch;while(1){DLNode *a,*b,*c;ListInitiate(&a);//初始化链表aListInitiate(&b); //初始化链表bListInitiate(&c); //初始化链表ccout<<"请输入两个数(以逗号隔开)\n例如342,43,:\n";InputNumber(a);//向链表a输入数据InputNumber(b); //向链表b输入数据Add(a,b,c);//将链表a链表b的相加得出的值插入链表c中 cout<<"要继续吗?(y/n) :";cin>>ch;if(ch=='Y'||ch=='y') //输入y或Y继续操作{cout<<endl;continue;}else return;}}3模块3.1 系统模块N-S图(1)初始化双向链表(N-S图)(2)求双向链表表长(N-S图)(3)双向链表的插入操作(N-S图)(4)双向链表的删除操作(5)链表输入数据操作(N-S图)(6)链表输出数据操作(7)任意两个整数的加运算(8)主函数三、需求分析3.1功能规定整个程序功能包含:双向链表的建立,对数据的插入删除, 输入输出数据, 两个整数相加3.2用户管理本程序可供任何用户使用。