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

合集下载

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

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

数据结构课程设计题目:长整数四则运算班级学号学生姓名提交日期成绩计算机与通信工程学院长整数四则运算一需求分析:问题描述:设计一个实现任意长的整数进行加法运算的演示程序。

基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

任何整形变量的范围是 -(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 题目介绍和功能要求 (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.基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。

要求输入和输出每四位一组,组间用逗号隔开。

如:1,0000,0000,0000,0000。

3.任务陈述:(a)输入的形式和输入值的范围:本实验中演示中,长整数的每位上的数字必须为数字[0 ——9]之间,长整数的位数要求无限长。

测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。

(b)输出的形式: 整数的范围无限制,可为正数,可为负数。

按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。

(c)程序所能达到的功能: 演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后,并对错误。

(d)测试数据: ①—⑧为正确输入数据,⑨为错误输入数据( 超出 4 位) ,⑩为错误输入数据( 不足 4 位)。

①两长整数a=b=0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 按该模式输入输入长整数 a您的输入结果为:0 ---------------------- 显示a(防止错误输入)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234---- 输入长整数 b 您的输入结果为:您的运算结果为:输出②b>a>01,1111,1111,1111您的输入结果为:1,1111,1111,11119,9999,9999,9999您的输入结果为:9,9999,9999,9999您的运算结果为:11,1111,1111,1110③a>b>09999,9999,9999您的输入结果为:9999,9999,9999请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为:2您的运算结果为:1,0000,0000,0001 ④b<a<0请按照如下形式输入第一个长整数,每四位一组-2345,6789您的输入结果为:-2345,6789请按照如下形式输入第二个长整数,每四位一组-7654,3211您的输入结果为:-7654,3211您的运算结果为:-1,0000,0000⑤a<0,b>0,|a|>|b|请按照如下形式输入第一个长整数,每四位一组-1,0000,00001您的输入结果为:-1,0000,0001请按照如下形式输入第二个长整数,每四位一组2您的输入结果为:: -1234,1234,1234 : -1234,1234,1234 : -1234,1234,1234 : -1234,1234,12342您的运算结果为:-9999,9999⑥a<0,b>0,|a|<|b|请按照如下形式输入第一个长整数,每四位一组-9999您的输入结果为:-9999请按照如下形式输入第二个长整数,每四位一组1,0000您的输入结果为:1,0000您的运算结果为:1⑦a>0,b<0,|a|>|b|请按照如下形式输入第二个长整数,每四位一组1,0000,0000您的输入结果为:1,0000,0000请按照如下形式输入第二个长整数,每四位一组-9999您的输入结果为:-9999您的运算结果为:9999,0001⑧a>0,b<0,|a|<|b| : -1234,1234,1234: -1234,1234,1234: -1234,1234,1234: -1234,1234,1234请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234您的输入结果为: 1请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,0000,0000您的输入结果为:-1,0000,0000您的运算结果为:-9999,9999⑨错误输入(例:输入超过四位,则自动取其前四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,12341,00000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-99998,01234您的输入结果为:-9999,1234您的运算结果为:-9998,1234⑩错误输入(例:非第一次输入少于四位,则在输入前加0 补足四位进行运算)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 1,000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,11您的输入结果为:-1,0011您的运算结果为:-11二、概要设计1.目标需求与设计思想通过尾插输入长整数,为实现顺序存入,并用头插存储的运算后的长整数,因为运算必定从后向前计算,同样为了实现顺序存入。

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

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

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

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

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

(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.4长整数四则运算题目:长整数四则运算一、实验内容【问题描述】设计一个实现任意长的整数进行加法运算的演示程序【基本要求】利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

任何整形变量的范围是-(2八15-1)〜(2八15-1)。

输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

【实现基本功能】⑴是想长整数的四则运算;(ii)实现长整数的乘方和阶乘运算;(iii)整形量范围是-(2沏-1)~(2八n-1),其中n是由程序读入的参量。

输入数据的分组方法另行规定;【实现加强版本的功能】⑴四则运算在原来版本的基础上支持小数运算,除法还可以通过输入整数后加小数点与相应要求取的精确位数求出精确值,如:求取3666除以7的后三位精确值,可以在输入时将除数输入为3666.000或3666.0000,就能得出相应的精确位数,当然求取后,没有余数的输出;(ii)乘方的功能也进行了强化,支持小数操作;(iii)添加了多个出错处理(即输入重操作)对相应数据输入与输出进行提示;【加强版的实现原理】⑴加减法运算加强:在原来版本的基础上依照基本的加减法操作将数据用小数点进行分隔,记录下连个输入数的小数位长度,并将小数位较短的一个数据后补0直至小数位数相同,然后用函数处理输出的数据;(ii)乘除法、乘方:其处理方法较为简单,主要是记录数据中小数位数的长度,然后通过每种运算方式不同的运算原理截取小数位,再按照输出格式将数据处理进行输出;(iii)根据定义,阶乘保持不变;【特色分析】⑴加强版程序加上了简单的声音提示,无论是输入与输出均会有八个音符的其中之一对输入与输出与否进行提示,同时在输入输出数据出错时,还会用三个音符对重输入进行提示,增强了人性化操作;【测试数据】(1)0;0;应输出“0”。

(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。

(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构课程设计---长整数运算没有测试,代码仅供参考!!!1:需求分析用户输入2个任意长整数,求它们的加法,减法和乘法,并将结果显示;2:设计思想a:数据结构的选用为了实现任意长整数的加法,减法和乘法,因为这几种运算都存在进位和借位以及位移等操作,因此选择双链表的结构体,它有一个data,left,right;考虑到data表示的数据的范围,使它只接受4个数字的整数,这样一个长整数就分为若干段,每一段为4个数字,便于进位和借位以及位移的操作;b:2个长整数的输入首先输入数的正负号,将它转化为相应的0和1;接着采用头插法的方式,当输入一个4个数字的整数时,就产生一个新的节点,它的值为输入的整数值,建立起它的左右指针,并用头节点指向它;为了判断一个长整数是否输入结束,定义一个结束标志,当输入正数时就继续,当输入负数时,就结束一个长整数的输入;同时用一个函数得到长整数的尾节点和段数,段数在比较2个数的大小有用。

c:2个长整数的加法先定义一个部分加法的函数,就是2个正的长整数的加法的运算;它从2个长整数的尾部开始,同时相加,接着再向左移一段,又同时相加;当2个数据的某一段同时存在时,就相加;当一个数据已经全部被相加后,另外一个数据的剩下的段就要全部复制到和中;在实行加法的时候,设置一个进位标志位,目的是为了使结果正确;当一段的数据相加产生进位时,那么进位标志位为1;下一次一段的数据相加就要加上这个进位标志位;而且如果2个长整数的所有的段的数据都相加完了,还要判断是否产生了进位标志位,如果有的话,就要新建一个节点,它的值就是1;2个正的长整数的求和就完成了。

再定义一个部分减法的函数,就是2个正的长整数的减法的运算;第一个长整数的大小一定大于第二个长整数的大小;它从2个长整数的尾部开始,同时相减,接着再向左移一段,又同时相减;当2个数据的某一段同时存在时,就相加;当第二个长整数已经全部被相减后,第一个数据的剩下的段就要全部复制到结果中;在实行减法的时候,设置一个借位标志位,目的是为了使结果正确;当一段的数据相减产生借位时,那么借位标志位为1;下一次一段的数据相减就要借去这个进位标志位;2个正的长整数的减法就完成了。

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

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

数据结构课程设计报告题目:长整数四则运算一、需求分析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 为结果的标识符操作结果:两个链表相加,求出结果。

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

题目:长整数的加法运算学院:计算机科学与工程学院专业:信息安全******学号:**********指导教师:***2014年10月18日目录引言 (4)1、系统概述 (4)2、系统分析 (5)2.1需求分析 (5)2.2系统功能 (5)2.3开发环境 (5)3、详细设计 (5)3.1功能结构框图 (6)3.2 软件设计 (6)3.2.1 定义链表与接收数据输入 (6)3.2.2长整数的加法运算 (8)3.2.3显示长整数相加结果 (10)4、所遇到的问题和分析解决 (10)5、系统特色及关键技术 (11)6、结论 (11)参考文献 (12)引言随着计算机技术的发展,人们利用计算机开发了许许多多方便的,实用的应用软件,在信息化的现代社会里,人们依赖着很多的应用软件,这些软件在推进社会发展的同时,也丰富了人们的生活,然而,在开发过程中,由于计算机系统的局限性,在需要某些功能时,总会遇到困难。

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

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

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

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;的格式输入,该程序定义了一个char ch用于保存“,”和“;”,当用户输入分号时表示结束输入,逗号用于间隔开每个结点。

在接收用户的输入时,采用的方法是先让用户输入整型变量,然后再输入字符型变量,即提示用户每输入一个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结点数据域的值,p q指针依次往前访问链表,重复如上的相加操作,直到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)中的进位处理相同,但在处理最高位时,要注意符号的正负性。

相关文档
最新文档