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

合集下载

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

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

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

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

任何整形变量的范围是 -(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. 输入输出程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。

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

二、概要设计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 为结果的标识符操作结果:两个链表相加,求出结果。

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

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

中国石油大学(北京)远程教育学院《数据结构》课程设计报告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感想与体会这是一门纯属于设计的科目,它需用把理论变为上机调试。

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

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

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

本文下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!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.问题描述:设计一个程序实现两个任意长的整数的求和运算。

2.基本要求:利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。

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

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

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

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

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

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

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

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

①两长整数a=b=0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234--------按该模式输入0 --------输入长整数a您的输入结果为:0 --------显示a(防止错误输入)请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234--------输入长整数b 您的输入结果为:您的运算结果为:0 --------输出②b>a>0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,12341,1111,1111,1111您的输入结果为:1,1111,1111,1111请按照如下形式输入第二个长整数,每四位一组: -1234,1234,12349,9999,9999,9999您的输入结果为:9,9999,9999,9999您的运算结果为:11,1111,1111,1110③a>b>0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 9999,9999,9999您的输入结果为:9999,9999,9999请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 2您的输入结果为:2您的运算结果为:1,0000,0000,0001④b<a<0请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 -2345,6789您的输入结果为:-2345,6789请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 -7654,3211您的输入结果为:-7654,3211您的运算结果为:-1,0000,0000⑤a<0,b>0,|a|>|b|请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 -1,0000,00001您的输入结果为:-1,0000,0001请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 2您的输入结果为:2您的运算结果为:-9999,9999⑥a<0,b>0,|a|<|b|请按照如下形式输入第一个长整数,每四位一组: -1234,1234,1234 -9999您的输入结果为:-9999请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234 1,0000您的输入结果为:1,0000您的运算结果为:1⑦a>0,b<0,|a|>|b|请按照如下形式输入第二个长整数,每四位一组: -1234,1234,12341,0000,0000您的输入结果为:1,0000,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-9999您的输入结果为:-9999您的运算结果为:9999,0001⑧a>0,b<0,|a|<|b|请按照如下形式输入第一个长整数,每四位一组: -1234,1234,12341您的输入结果为: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,12341,000您的输入结果为:1,0000请按照如下形式输入第二个长整数,每四位一组: -1234,1234,1234-1,11您的输入结果为:-1,0011您的运算结果为:-11二、概要设计1.目标需求与设计思想通过尾插输入长整数,为实现顺序存入,并用头插存储的运算后的长整数,因为运算必定从后向前计算,同样为了实现顺序存入。

大整数的四则运算课程设计

大整数的四则运算课程设计

大整数的四则运算课程设计中北大学课程设计说明书学院、系:软件学院专业:软件工程学生姓名:宋雨琪学号:1221011205 设计题目:大整数的四则运算起迄日期: 2013年10月11日~2013年11月16日指导教师:薛海丽日期: 2013年11月16日1 设计目的本课程设计是采用C语言,在VC平台下实现大整数的四则运算,该系统运行在MS-DOS命令行模式下。

本课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。

提高学生适应实际,实践编程的能力。

1)进一步巩固和复习C程序设计的基础知识;2)培养学生结构化程序、模块化程序设计的方法和能力;3)了解软件的编制过程及各环节的具体内容;4)提高学生程序调试技巧、软件设计能力和代码规范化等素质;提高学生分析问题、解决问题以及实际运用能力。

2 任务概述完成大整数的四则运算任务,假定整数不超过五十位要求:1) 在屏幕上能够手动输入待求的两个大整数;2) 输入完成后通过选择可以完成大整数的加、减、乘、除运算;3)将结果分别显示在屏幕上。

4) 验收时程序能够演示,自己单独做。

3 模块划分1) 定义c_to_d(char str[N], char d[N])函数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标2)定义d_to_c(char d[N], char str[N], int start)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str3)定义加法函数4)定义减法函数5)定义乘法函数6)定义除法函数7)定义输出格式函数8)运用主函数计算4 主要函数说明及其N-S图1)主函数说明①定义变量②输入要进行运算代码数字③输入数字④调用函数进行运算2)其他函数说明①min函数,比较两数大小②c_to_d(char str[N], char d[N])函数,实现把str的各位转变成对应整数,右对齐存入d, start为最高位下标③d_to_c(char d[N], char str[N], int start)函数,实现把d中数字d[start...N-1]转变为字符左对齐存入str④add(char str_a[N], char str_b[N], char str_c[N]),加法函数⑤sub(char str_a[N], char str_b[N], char str_c[N]),减法函数⑥compare(char str1[N], char str2[N]) ,实现str1,str2内存的是要进行比较的大整数⑦mul(char str_a[N], char str_b[N], char str_c[N]),乘法函数⑧divd(char str_a[N], char str_b[N], char str_c[N]),除法函数主要函数的N-S 图: 图1:函数c_to_d(char str[N],char d[N]) N-S 图图2:函数d_to_c(char d[N],char str[N],int start)N-S 图定义变量x,y,str[N],d[N],startI,j,lenint len,start,i,jfor(i=0,j=start;i<len;i++,j++)len=strlen(str) str[len]=’\0’for(i=0,j=start;i<len;i++,j++)定义变量x,y,str[N],d[N],I,j,lenint len,start,i,jfor(i=0;i<N;i++)len=strlen(str)start=N-lenreturn start图3:加法运算函数add()的N-S 图如果有进位Tc[i]=a[i]+b[i]+carry;carry=c[i]/10;定义变量 str_a[N], str_b[N], str_c[N]i=N-1; carry=0;调用函数c_to_d()start_c=min(start_a,start_b);start_c--; 调用函数d_to_c()图4:减法运算函数sub()的N-S 图图5:比较函数compare()的N-S 图while(i<N && c[i]==0 ) memset(c,0,sizeof(c),)将c 中有效的个字节i=N-1;borrow=0c[i]=a[i]-b[i]-borrow 如果有borrow=1;c[i]+=10borrow=1;i-- i++if(len1>定义变量 str1[N], str2[N],len1,len2len2=strlen(str2)if(len1return -1; retu return 定义变量 str_a[N], str_b[N], str_c[N]调用函数c_to_d()调用函数len1=strlen(str1)for(j=N-1;j>=start_b;j--)图6:乘法运算函数的N-S 图for(j=N-1;j>=start_b;j--) memset(c,0,sizeof(c),) for (i=N-1,k=j;i >=start_a;i--,k--)d[k]=a[i]*b[j];if(carry>0) 如果有进位d[k]=carry;start_d=k+1; 把d 累加到c 中memset(c,0,sizeof(c),)carry=for(i=N-1;i>=start_d;i--)c[i]=c[i]+d[i ]+carry; if(carry>0)c[i]=castart_c=i+1;调用函数定义变量str_a[N], str_b[N],len1=strlen(str_a); len2=strlen(str_b)调用函数c_to_d()图7:除法运算函数的N-S 图len1=strlen(str_a); len2=strlen(str_b)strcpy(rmd, str_a)rmd[len2]='\0';cur=len2-1 cur 记下当前商对应的a 中的下if(compare(rmd, cur++;K=0while(str_a[cur ]!='\0')while(compare(rmd,st r_b)>=0)sub(rmd, str_b,temp); cur++len_rmd=strlen(rmd)rmd[len_rmd]=str_a[cur]rmd[len_rmd+1]='\0'for(i=0;i<k;i++)str_c[i]=c[i]memset(c,0,si k++str_c[i]='\0'定义变量str_a[N],图8:运行四则运算的主函数的N-S 图5 程序运行数据及其结果1) 测试加法 输入1再输入1234567890和1234567890987for(i=1; ;i++)调用输出格式函数welcome()输入一个数x判断x 是否等于0 定义变量x,i, 输出(“程序结束,欢迎 您的while(x>4||x<0) 输出("输入错误,请重再次输入一个数字输出(”请输入需要输入一个数 再输入一个数switch()case 1:运行case 2:运case 3:运case 4:运输出结图一加法运算结果2)测试减法输入2再输入123123123132和123123123图二减法运算结果3)测试乘法输入3再输入12363445234和23452435图三乘法运算结果4)测试除法输入4再输入1234567890和123456789图四除法运算结果5)退出输入0图五退出程序6 课程设计心得这次我的课程设计是大整数的四则运算,由于平常使用的32位操作系统上,整形数的长度是32位,即四个字节,对于一般的应用,这个长度的整数已经足够。

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

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

一、需求分析【问题描述】设计一个程序实现两个任意长的整数求和运算。

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

任何整型变量的范围是:-(215-1)~(215-1)。

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

【测试数据】(1)0;0;应输出“0”。

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

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

(4)1,0001,0001;-1,0001,0001;应输出“0”。

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

二、设计1. 设计思想(1)存储结构:循环双向链表(2)主要算法基本思想:1、每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。

但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。

故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。

2、可以利用头结点数据域的符号代表长整数的符号。

用其绝对值表示元素结点数目。

相加过程中不要破坏两个操作数链表。

两操作数的头指针存于指针数组中是简化程序结构的一种方法。

不能给长整数位数规定上限。

2. 设计表示(1)函数调用关系图:(2)函数接口规格说明:结构体:struct dl_node{int x;dl_node *pre;dl_node *next;};初始化:void list_init(dl_node ** h)插入元素:void list_insert(dl_node *h,int x)输出链表:void prin(dl_node *h)实现相加:void list_add(dl_node *h1,dl_node *h2)实现相减:void list_sub(dl_node *h1,dl_node *h2)3. 详细设计(1)输入两个数,用链表来存储。

大整数课程设计报告

大整数课程设计报告

中国矿业大学银川学院数据结构课程设计报告(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位的整数。

数据结构课设

数据结构课设

数据结构课设数据结构课设大整数计数器 1.问题描述实现大整数(200位以内的整数)的加、减、乘、除运算。

2.设计要求设计程序实现两个大整数的四则运算,输出这两个大整数的和、差、积、商及余数。

3.数据结构本课程设计采用顺序串来实现。

4.问题分析由于整数数据存储位数有限,因此引入串的概念,将整型数据用字符串进行存储,利用字符串的一个字符存储大整数的一位数值,然后根据四则运算规则,对相应位依次进行相应运算,同时保存进位,从而实现大整数精确的运算。

具体设计思路如下:(1)计算大整数加法时,采用数学中列竖式的方法,从个位(即字符串的最后一个字符)开始逐位相加,超过或达到10则进位,同时将该位计算结果存到另一个字符串中,直至加完大整数的所有位为止。

(2)计算大整数减法时,首先调用库函数strcmp判断这两个大整数是否相等,如果相等则结果为0,否则用pare函数判断被减数和减数的大小关系,进而确定结果为正数还是负数,然后对齐位依次进行减法,不够减则向前借位,直至求出每一位减法之后的结果。

(3)计算大整数乘法时,首先让乘数的每一位都和被乘数进行乘法运算,两个乘数之积与进位相加作为当前位乘积,求得当前位的同时获取进位值,进而实现大整数的乘法运算。

(4)计算大整数除法时,类似做减法,基本思想是反复做减法,从被除数里最多能减去多少次除数,所求得的次数就是商,剩余不够减的部分则是余数,这样便可计算出大整数除法的商和余数。

需求分析 (1) 任何一个表达式都是由操作数、运算符和界限符组成的,我们称之为单词.(2) 表达式求值首先要符合四则运算规则: ① 先乘除,后加减② 从左到右进行运算③ 先括号内,后括号外 (3) 功能实现: ① 若当前单词为数字串,则压入数值栈② 若当前单词为运算符并大于运算栈的栈顶符号,则进栈③ 若当前单词为运算符并等于运算栈的栈顶符号,去括号,输出④ 若当前单词为运算符并小于运算栈的栈顶符号,则进行运算课程设计的目的通过课程设计全面掌握《C语言程序设计》关键知识点,掌握C语言中数组、指针、结构体、文件等方面的基本知识。

大整数课程设计

大整数课程设计

大整数课程设计一、课程目标知识目标:1. 理解大整数的概念,掌握大整数的表示方法,如数位表示、指数表示等。

2. 学会进行大整数的加减乘除运算,并掌握相关运算规则。

3. 掌握大整数在生活中的应用,如数的进制转换、编码等。

技能目标:1. 能够运用数位表、计算器等工具进行大整数的计算。

2. 培养学生的逻辑思维和问题解决能力,能够解决涉及大整数的实际问题。

3. 提高学生的数学表达和交流能力,能够清晰、准确地描述大整数的运算过程。

情感态度价值观目标:1. 培养学生对待数学学习的积极态度,激发他们探索大整数知识的兴趣。

2. 培养学生的团队合作精神,使他们能够在小组讨论中分享观点、倾听他人意见。

3. 引导学生认识到数学知识在实际生活中的重要作用,增强他们对数学价值的认识。

本课程针对小学高年级学生设计,充分考虑学生的认知特点,以实用性为导向,结合教材内容,旨在提高学生对大整数的认识和应用能力。

通过本课程的学习,使学生能够熟练掌握大整数的运算方法,培养他们的数学思维和解决问题的能力,同时激发学生的学习兴趣,增强他们的自信心和成就感。

课程目标具体、可衡量,为后续教学设计和评估提供了明确的方向。

二、教学内容1. 大整数的认识- 数位表示法:亿、万亿等数位的认识与运用。

- 指数表示法:科学记数法的理解与转换。

2. 大整数的运算- 加法运算:大整数的加法规则及应用。

- 减法运算:大整数的减法规则及应用。

- 乘法运算:大整数的乘法规则及简便计算方法。

- 除法运算:大整数的除法规则及商、余数的处理。

3. 大整数在实际生活中的应用- 进制转换:二进制、八进制、十进制、十六进制的相互转换。

- 编码应用:了解大整数在计算机编码中的应用。

4. 大整数的数学思维训练- 问题解决:运用大整数知识解决实际问题。

- 逻辑推理:通过大整数运算,培养逻辑思维和分析能力。

教学内容参考教材相关章节,以系统性和科学性为原则,安排如下:第一课时:大整数的认识及数位表示法。

大整数课程设计

大整数课程设计

大整数课程设计一、教学目标本课程的教学目标是让学生掌握大整数的基本概念、性质和运算方法,培养学生的数学思维能力和解决问题的能力。

具体目标如下:1.知识目标:学生能够理解大整数的定义、性质和表示方法,掌握大整数的加、减、乘、除等基本运算方法。

2.技能目标:学生能够运用大整数的概念和运算方法解决实际问题,提高学生的数学应用能力。

3.情感态度价值观目标:学生通过学习大整数,培养对数学的兴趣和好奇心,增强对数学问题的探究精神,培养合作意识和创新能力。

二、教学内容本课程的教学内容主要包括大整数的基本概念、性质和运算方法。

具体安排如下:1.第一课时:大整数的定义和性质,大整数的表示方法。

2.第二课时:大整数的加法运算,减法运算。

3.第三课时:大整数的乘法运算,除法运算。

4.第四课时:大整数的混合运算,实际问题解决。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。

1.讲授法:教师通过讲解大整数的基本概念、性质和运算方法,引导学生理解和掌握相关知识。

2.讨论法:学生分组讨论大整数的相关问题,培养学生的合作意识和解决问题的能力。

3.案例分析法:教师提供一些实际问题,学生运用大整数的概念和运算方法进行分析和解决,提高学生的数学应用能力。

4.实验法:学生进行大整数的运算实验,通过实际操作加深对大整数运算方法的理解。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《数学课本》相关章节内容。

2.参考书:《数学辅导书》相关章节内容。

3.多媒体资料:教学PPT、视频动画等。

4.实验设备:计算器、纸张、笔等。

以上教学资源将帮助学生更好地理解和掌握大整数的相关知识,提高学生的学习效果。

五、教学评估本课程的教学评估将采用多元化的方式,以全面、客观地评估学生的学习成果。

评估方式包括平时表现、作业和考试等。

1.平时表现:教师将根据学生在课堂上的参与程度、提问和回答问题的情况进行评估,以了解学生的学习态度和思维能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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大。

相关文档
最新文档