长整数的加减运算系统说明文档11003601.
任意长整数的四则运算
1 题目介绍和功能要求1.1 课程设计题目要求【问题描述】:设计一个实现任意长的整数进行加法运算的演示程序。
【题目容】:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的围是-(215- 1)~(215- 1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【基本要求】:(1)利用所学知识,设计相应的数据结构;(2)熟练运用开发环境;(3)完成软件的设计与编码;(4)熟练地掌握基本的调试方法。
1.2 题目分析【需求分析】:(1)本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
(2)本演示程序中,数字字符限定为[‘0’~‘9’]和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
(3)利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以回车结束,可以直接输入正数或负数。
按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果。
2 系统功能模块结构图2.1 系统功能结构框图图2.1 系统功能结构图2.2主要模块的功能说明:(1)主调程序模块:void main(){初始化;do{接受命令;处理命令;}while(“命令”=”退出”)}(2)双向循环链表处理模块//cmplinklen.h //Creat.h //compare 说明:进行链表的存储和处理(3)长整数运算模块//add.h // sub.h //imul.h //idiv.h 说明:对长整数进行四则运算(4)界面模块//title.h //welcome.h说明:控制系统运行操作界面3 数据结构的设计及用法说明3.1概要说明为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,仅绝对值不超过9999的整数,整个链表用十进制数表示。
超长正整数加法和乘法报告书
信息工程学院数据结构与C语言综合训练报告(2011~2012学年第二学期)报告题目:____超长正整数的加法________姓名:______李莉_______专业:信息管理与信息系统年级班级: ____112班________指导教师:__李宏利、张晶___完成日期:_2012年7月12日一、综合训练目的和要求本综合训练是计算机科学与技术、信息管理与信息系统、软件工程、电子商务专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》、《数据结构》课程后进行的一次全面的综合练习。
本课综合训练的目的和任务:1. 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言、数据结构解决实际问题的能力二、综合训练任务内容利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。
要求输入和输出每四位一组,组间用逗号隔开。
如:1,0000,0000,0000,0000。
提高要求:完成两个超长正整数的乘法。
三、总体设计函数调用关系图(如下)mainAdd() Output() Input() Change() Mul()Sum()函数的流程图(如下)Y NYNNY开始m=0操作说明 输入字符串a[] Input() n=N输入n 输入字符串b[] Input() n=N ’输入n Change(a) Change(b) 输入mMul()Add()四、详细设计说明主函数模块包括判断函数输入模式是否正确的模块,输入转换模块,数值计算模块和输出模块。
在主函数中首先调用函数Input (),然后调用到函数Change (),在Change ()函数中调用了函数Sum (),随后主函数中又根据操作者调用了函数Add ()或者函数Mul (),最后主函数调用了函数Output ()后程序结束。
超长整数及存储与运算设计说明书
计算机科学系课程设计任务书摘要计算机计算结果的精度,通常要受到计算机硬件环境的限制。
在C语言和VB中对于有符号的长整型数据的范围是-2147483648到2147483647之间,用户一般是无法改变的。
但是,我们可以通过“软”的方式来解决这一困难,即通过程序设计的方法进行超长整型数据的计算。
运算因子超出了整型能表示的范围,肯定不能直接用一个数的形式来表示。
在C语言中,能表示多个数的数据类型有两种:数组和字符串。
因此采用字符串读入数据,用数组存储数据。
解决了高级程序设计语言处理数据存储空间问题,实现了超长整数的加减乘除求余运算。
超长整型数据的存储与运算设计对超长整数分别进行了存储与加减乘除求余运算,达到了预期目标,最后对实现算法做了简要的分析和介绍。
关键词:超长整型数据;字符串;数组AbstractComputer calculation results, the precision of computer hardware environment is usually to the limit. In C language and VB to have long integer data of symbols of integers range is 2147483648 - between the users to can’t be changed. However, we can use the word "soft" way to solve this difficult, namely through programming method for long integer data calculation.Computing factor beyond the scope of integer can say, must not be directly used a number of forms. In C, can say the number of data types is more than two kinds: arrays and string. Therefore, the use of input data using string array of data storage. Solve a high-level programming language processing data storage space, the problem of long integer arithmetic for more add, subtract, multiply and divide.Long integer data storage and operation of long integer separately designed for the storage and add, subtract, multiply and divide more computing, and finally reached the expected goal to realize algorithm provides a brief introduction and analysis.Keywords: long integer;string;array目录第一章绪论 (1)1.1课程背景 (1)1.2课程目的 (1)1.3课程意义 (1)1.4课程设计采取的基本原理和主要技术方法 (1)第二章设计简介及设计方案论述 (2)2.1程序的主要功能 (2)2.2程序设计的思想 (2)2.2.1运算数据、结果的输入和存储 (2)2.2.2超长整数加法运算 (2)2.2.3超长整数减法运算 (3)2.2.4 超长整数乘法运算 (3)2.2.5 超长整数的整除及求余运算 (4)第三章详细设计 (5)3.1超长整型数据的输入 (5)3.2超长整数的加法 (5)3.3超长整数的减法 (6)3.4超长整数的乘法 (6)3.5超长整数的整除及求余 (7)第四章设计结果及分析 (10)4.1设计概述 (10)4.2设计约束 (10)4.3运行流程 (10)总结 (11)致谢 (12)参考文献 (13)附录 (14)第一章绪论1.1 课程背景随着现代社会计算机科学技术与经济的不断飞速发展,计算机在科学计算与人们日常生活中的应用也越来越普及,利用计算机实现一些数据的存储与计算也显得越来越重要,因而相对于科学计算精度的要求也越来越高。
长整数运算说明书.
目录摘要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域保存数的正负。
实验报告长整数四则运算
实验报告:长整数四则运算实验者:唐怡04120082 题目:设计一个实现任意长的整数进行加法运算的演示程序一.需求分析1.本演示程序中,长整数为任意长的带符号的长整数的输入及求加法后输出的长整数形式为每四位一组,组间用逗号隔开,输入以“回车符”为结束标志。
2.程度执行的命令包括:1)构造整数1,2)构造整数2,3)做加法运算,4)结束3.测试数据(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”(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
二.概要设计为实现上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表1.有序表的抽象数据类型定义为:ADT Dulinklist{数据对象:D={ai|ai为带符号整数,1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于集合D,ai-1<ai,i=2,…..,n}基本操作:InitDulinklist(&)操作结果:构造一个空的有序表LDestroyDulinklist(&)初始条件:有序表L已存在操作结果:销毁有序表LDulinklistLength(L)初始条件:有序表L已存在操作结果:返回有序表L的长度DulinklistEmpty(L)初始条件:有序表L已存在操作结果:若有序表L为空表,则返回TUER,否则返回FALSEGetElem(L,pos)初始条件:有序表L已存在操作结果:若干1〈=POS〈=LENGTH(L),则返回有序表L中第POS个数据元素。
数据结构课程设计长整数加减运算
课程名称数据结构课程设计题目长整数加减运算一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长。
正确处理好运算之后的进位和借位。
(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.设计思路:由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。
将各部分的结果整合起来。
由于计算机固有的整数类型存数的对大整数是2^15-1,因此为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。
从最低位开始加法,超过一万向上进位,因此每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算能够借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。
2.数据结构设计:因为计算的是一个连续的数字,需要桉顺序一次计算,因此采用的数据结构的逻辑结构是线性表。
因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
长整数运算说明书
{scanf("%s",&ch1);
if(ch1=='+'||ch1=='-')
{yunsuan(a,b,c,ch1);
OutputNumber(c,1);
break;
}
else
{printf("\n此版本不支持%c运算!是否重新输入运算符?(y/n):",ch1);
scanf("%s",&m);
2.本程序中,集合的元素限定为数字字符[‘0’~’9’]和字பைடு நூலகம்‘,’与‘;’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
3.现实长整数的分组存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
操作结果:将以head为头结点的链表中的所有数据输出到显示屏上。
void add(DLNode *head1,DLNode *head2,DLNode *head3)
操作结果:实现正数加正数的加法操作。
int change(DLNode *head1,DLNode *head2)
操作结果:判断存在俩个链表中的数的大小,如何head1中的数大于head2中的数那么返回值为0,反之返回值为1,相等时返回值为2。
if(m=='Y'||m=='y'){ n=2;printf("\n请输入运算符'-'或'+':");}
长整数的加减运算
*******************实践教学*******************兰州理工大学技术工程学院2013年春季学期数据结构课程设计题目:长整数的加减运算专业班级:计算机科学与技术一班姓名:郭利强学号: 11730108指导教师:王连相成绩:计算机科学与技术专业数据结构课程设计任务书(11级)题目:长整数的加减运算学生姓名:郭利强学号:11730108班级:11级计算机科学与技术一班题目类型:软件工程(R)指导教师:王连相一.题目简介该设计要求学生设计程序,实现两个任意长的整数求和及差的运算问题。
通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握线性表上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
二.主要任务第一部分:基本算法实现1、线性结构基本算法实现(指导老师根据题目指定);2、树型结构基本算法实现(指导老师根据题目指定);3、图型结构基本算法实现(指导老师根据题目指定);4、查找基本算法实现(指导老师根据题目指定);5、排序基本算法实现(指导老师根据题目指定);第二部分:指定题目的设计与实现1、查阅文献资料,一般在3篇以上;2、建立数据的逻辑结构和物理结构;3、完成相应算法的设计;4、完成测试工作;5、撰写设计说明书;6、做好答辩工作。
三.主要内容、功能及技术指标(1)使用双向循环链表存储长整数,每个结点含一个整型变量,主要功能有:长整数输入(建立双向循环链表)、长整数的加法、长整数的减法及结果的显示输出等;(2)至少要用10组测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果;(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;(4)任何整型变量的范围是-(215-1)~(215-1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,例1,0000,0000,0000;而输入为1,0001,0001和-1,0001,0000实现加法时,应输出"1";(5)较高要求:使程序在整型量范围是-(2n-1)~(2n-1)的计算机上都能有效地运行。
(完整word版)长整数四则运算实验报告
一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。
在这里长整数没有范围限制,可任意长。
运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。
测试数据:0、0;输出“0”2345,6789、-7654,3211;输出“1,0000,0000”1,0000,0000,0000、9999,9999;输出“9999,0000,0001”1,0001,0001、;1,0001,0001;输出“0”自选数据:1,1111;1,1111 输出“0”二、概要设计1、数据结构利用双向循环链表来实现对长整数的存储。
选择该数据结构来完成长整数的加减运算是因为a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。
b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。
c.在运算过程中有进位和借位的操作。
2、使用算法三、详细设计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() //入口函数四、调试分析由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。
老师在检查的过程中指出并教导了这一点。
五、测试结果1、输入0和0做加法运算,输出“0”,结果如下图:2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图:3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”,结果如下图:4、输入1,0001,0001和1,0001,0001做减法运算,输出“0”,结果如下图:5、输入1,1111和1,1111做减法运算,输出“0”结果如下图:六、心得体会本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。
《数据结构》课程设计报告-任意长的整数加减法运算
中国石油大学(北京)远程教育学院《数据结构》课程设计报告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感想与体会这是一门纯属于设计的科目,它需用把理论变为上机调试。
长整数加减运算
*******************实践教学*******************兰州理工大学技术工程学院2013年春季学期数据结构课程设计题目:长整数的加减运算专业班级:计算机科学与技术一班姓名:郭利强学号: 11730108指导教师:王连相成绩:计算机科学与技术专业数据结构课程设计任务书(11级)题目:长整数的加减运算学生姓名:郭利强学号:11730108班级:11级计算机科学与技术一班题目类型:软件工程(R)指导教师:王连相一.题目简介该设计要求学生设计程序,实现两个任意长的整数求和及差的运算问题。
通过该题目的设计过程,可以加深理解线性表的逻辑结构、存储结构,掌握线性表上基本运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问题,培养学生的动手能力。
二.主要任务第一部分:基本算法实现1、线性结构基本算法实现(指导老师根据题目指定);2、树型结构基本算法实现(指导老师根据题目指定);3、图型结构基本算法实现(指导老师根据题目指定);4、查找基本算法实现(指导老师根据题目指定);5、排序基本算法实现(指导老师根据题目指定);第二部分:指定题目的设计与实现1、查阅文献资料,一般在3篇以上;2、建立数据的逻辑结构和物理结构;3、完成相应算法的设计;4、完成测试工作;5、撰写设计说明书;6、做好答辩工作。
三.主要内容、功能及技术指标(1)使用双向循环链表存储长整数,每个结点含一个整型变量,主要功能有:长整数输入(建立双向循环链表)、长整数的加法、长整数的减法及结果的显示输出等;(2)至少要用10组测试数据,算法对于这些合法的输入数据都能产生满足规格说明要求的结果;(3)算法对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;对算法实现过程中的异常情况能给出有效信息;(4)任何整型变量的范围是-(215-1)~(215-1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,例1,0000,0000,0000;而输入为1,0001,0001和-1,0001,0000实现加法时,应输出"1";(5)较高要求:使程序在整型量范围是-(2n-1)~(2n-1)的计算机上都能有效地运行。
数据结构:长整数的加减法(任意长度的加减法)
《数据结构》课程设计报告课程设计报告名称长整数的加法运算实验室实验楼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)正确测试结果:三、设计总结通这次实验让我充分认识到了自己所掌握程序设计知识的贫瘠,在长整的数字的运算之中,在一些数字的长度人可以接受的范围内我们通过用笔列算式、大脑的思考对两个较长的整数进行运算如果计算能力可以的话很快就能得出结果,整个运算的过程简单。
长整数的加减运算系统说明文档11003601
桂林电子科技大学综合设计说明书用纸《数据结构与算法》课程设计说明书题目:长整数的加减运算学院:计算机科学与工程学院专业:信息安全姓名:xxxxxxxx学号:11003601xx指导教师:张瑞霞老师2013年9 月13 日成绩评定标准及成绩1、能按照格式进行写作,无抄袭现象(10分)2、报告内容行文通畅,有条理性,无错别字,结构严谨。
(10分)3、能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。
(10分)4、在验收过程中,能合理的回答问题(20分)5、软件能正常运行,实现所提出的功能(40分)6、软件代码规范性较好(5分)7、具有自己的创新或特色(5分)总成绩:目录1、前言 (3)2、需求分析 (4)2.1.问题描述: (4)2.2.基本要求: (4)2.3.更高要求: (4)2.4.测试数据: (4)2.5.开发环境 Visual C++6.0(完整绿色版) (5)3、系统概述 (5)3.1.关键技术。
(5)3.2.相关的函数接口 (6)3.3.功能设计 (7)4、系统分析 (7)5、系统的调试与结果 (17)5.1.调试过程出现的问题以及解决方法 (17)5.2.成功的测试数据截图 (17)6、课设小结 (20)7、参考文献: (21)1、前言本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
C++实现长整数加法
长整数加法——用单链表和栈实现1 分析1.1 背景分析长整数的加法运算在统计中经常用到,特别是在国家、企业等大型机构的数据统计过程中,长整数加法运算更为常见。
整数加法运算是并不困难的,但是在不断重复的过程中,容易出现计算错误。
虽然说普通计算器也可以进行长整数加法,但是当整数为超长整数的时候容易产生溢出的问题。
因此,有必要利用计算机设计出一个解决长整数加法运算问题的应用程序。
1.2 功能分析本程序功能简单,就是进行整数的加法运算。
对于任意两个长整数,本应用程序都可以进行加法运算。
这两个长整数的长度可以是大于0的任意长度的,只要计算机的运行条件允许,这两个整数加法运算的都可以进行,比普通的计算器功能强大。
这两个整数可以是正数,也可以是负数,这也就意味着本程序可以进行两个长整数的加减法运算。
对于输入的整数,如果前n位为0,则从n+1位记录整数,如果全为0,则最终记录为0。
如000125被识别为125,00000被识别为0。
2 设计2.1 数据结构设计作为长整数,使用int或long long等整型是不符合运算要求得,因为这些类型在处理超长整数得时候可能会产生溢出,造成运算结果错误。
使用数组可以解决问题,但是数组的长度固定,对小的整数运算来说很浪费空间,数组不够理想。
使用动态数组也可以解决问题,并且程序设计也相对简单,使用动态数组是一种比较理想的解决方法,但是本程序不采用此解决方案。
双向链表亦可以解决此问题,但是程序设计过程相对较繁杂,本程序不采用。
使用string字符串类型也是一种理想的解决方案,本程序不直接采用此方案。
本程序采用单链表和栈共同来解决长整数的加法问题。
利用单链表从低位到高位的顺序存储长整数,这样方便进行从低位到高位的加法运算。
而栈在本程序中的作用则是把长整数从高位到低位输出。
因为单链表无法从表尾向表头访问,所以从表头往表尾访问时,把数据存入栈里面即可完成整数从高位到低位输出。
2.2 类结构设计经典的链表一般包括两个抽象数据类型(ADT)——链表结点类(LinkNode)与链表类(LinkList),而两个类之间的耦合关系可以采用嵌套、继承等多种关系。
c语言长整数加法运算 -回复
c语言长整数加法运算-回复C语言长整数加法运算在C语言中,我们可以使用不同的数据类型来存储和处理不同的数据。
其中,整数是最基本的数据类型之一,它用于存储整数值。
然而,有时我们需要处理超过整数范围的大整数。
C语言提供了长整数数据类型来满足这种需求。
长整数类型通常具有更大的位数,可以存储比普通整数更大的整数值。
在本文中,我们将讨论使用C语言进行长整数加法运算的步骤。
步骤1:了解长整数的数据类型在C 语言中,长整数通常使用`long int` 或`long long int` 类型。
这两个类型是有符号的,分别可以存储较大的整数值。
`long int` 类型通常具有32 位,而`long long int` 类型可能具有64 位。
这意味着`long long int` 类型可以存储更大的整数值。
步骤2:声明和初始化长整数要执行长整数加法运算,首先需要声明和初始化两个长整数变量,以便存储待加的值。
可以使用以下代码:clong long int num1, num2;num1 = 1234567890123456789LL; LL后缀表示长整数类型num2 = 9876543210987654321LL;在上面的示例中,我们声明了两个`long long int` 类型的变量`num1` 和`num2`,并将它们初始化为需要进行加法运算的值。
步骤3:执行长整数加法运算在C 语言中,可以直接使用`+` 运算符执行长整数的加法运算。
以下是一个示例代码:clong long int sum;sum = num1 + num2;在上面的示例中,我们使用`+` 运算符将`num1` 和`num2` 相加,并将结果存储在`sum` 变量中。
步骤4:输出结果最后一步是输出长整数加法运算的结果。
我们可以使用`printf` 函数将结果打印到屏幕上。
以下是一个示例代码:cprintf("Sum: lld\n", sum);在上面的示例中,我们使用`lld` 格式说明符来指定要打印的长整数类型。
整数的加减运算与应用知识点总结
整数的加减运算与应用知识点总结整数的加减运算是数学中基础的运算之一,我们在日常生活和学习中经常会用到它们。
掌握整数的加减运算及其应用知识点,对我们解决问题和提高数学能力都非常重要。
本文将对整数的加减运算与应用知识点进行总结。
一、整数的加法运算整数的加法运算遵循“符号相同则相加,符号不同则相减”的原则,即同号相加,异号相减。
1. 同号整数相加当两个整数的符号相同时,只需将它们的绝对值相加,再保持原来的符号即可。
例如:3 + 5 = 8(-4) + (-2) = -62. 异号整数相加当两个整数的符号不同时,只需将它们的绝对值相减,结果的符号由较大的绝对值决定。
例如:7 + (-3) = 4(-5) + 2 = -3二、整数的减法运算整数的减法运算可以转化为加法运算,即被减数+减数的相反数。
例如:8 - 3 = 8 + (-3) = 5(-5) - (-2) = (-5) + 2 = -3三、整数的应用知识点整数的加减运算不仅仅停留在纸面上,它在实际生活和学习中有着广泛的应用。
1. 温度计算温度计算常常涉及负数,比如冬天的气温可以低于零度。
我们可以用整数的加减运算来计算不同地区的温差、温度的变化等。
2. 资金收支在日常生活中,我们经常需要计算资金的收支情况。
当我们的账户有存款时,可以用正数表示;当我们的账户有支出时,可以用负数表示。
通过整数的加减运算,可以帮助我们了解资金的变动情况。
3. 消费计算在购物、结账时,我们经常会遇到价格的加减计算。
如果购买了多件商品,每件商品的价格可以用正数表示;如果有优惠活动或者退款,可以用负数表示。
通过整数的加减运算,我们可以计算出最终的支付金额。
4. 质量计算质量计算也常常涉及到整数的加减运算。
比如两个物体分别有正质量和负质量,通过加减运算可以计算它们的总质量。
总结:整数的加减运算是数学中基础的运算,掌握了它们可以帮助我们解决实际问题。
在日常生活和学习中,我们经常会遇到整数的应用场景,比如温度计算、资金收支、消费计算和质量计算等。
超长正整数的加法
超长正整数的加法请设计一个算法来完成两个超长正整数的加法。
*问题分析与算法设计首先要设计一种数据结构来表示一个超长的正整数,然后才能够设计算法。
首先我们采用一个带有表头结点的环形链来表示一个非负的超大整数,如果从低位开始为每个数字编号,则第一位到第四位、第五位到第八位...的每四位组成的数字,依次放在链表的第一个、第二个、...结点中,不足4位的最高位存放在链表的最后一个结点中,表头结点的值规定为-1。
例如:大整数“587890987654321”可用如下的带表头结点head的链表表示:按照此数据结构,可以从两个表头结点开始,顺序依次对应相加,求出所需要的进位后代入下面的运算。
具体的实现算法请见程序中的注释。
*程序与程序注释#include<stdio.h>#include<stdlib.h>#define HUNTHOU 10000typedef struct node{ int data;struct node *next;}NODE; /*定义链表结构*/NODE *insert_after(NODE *u,int num); /*在u结点后插入一个新的NODE,其值为num*/ NODE *addint(NODE *p,NODE *q); /*完成加法操作返回指向*p+*q结果的指针*/ void printint(NODE *s);NODE *inputint(void);void main(){NODE *s1,*s2,*s;NODE *inputint(), *addint(), *insert_after();printf("Enter S1= ");s1=inputint(); /*输入被加数*/printf("Enter S2= ");s2=inputint(); /*输入加数*/printf(" S1="); printint(s1); putchar('\n'); /*显示被加数*/printf(" S2="); printint(s2); putchar('\n'); /*显示加数*/s=addint(s1,s2); /*求和*/printf("S1+S2="); printint(s); putchar('\n'); /*输出结果*/}NODE *insert_after(NODE *u,int num){NODE *v;v=(NODE *)malloc(sizeof(NODE)); /*申请一个NODE*/v->data=num; /*赋值*/u->next=v; /*在u结点后插入一个NODE*/return v;}NODE *addint(NODE *p,NODE *q) /*完成加法操作返回指向*p+*q结果的指针*/{NODE *pp,*qq,*r,*s,*t;int total,number,carry;pp=p->next; qq=q->next;s=(NODE *)malloc(sizeof(NODE)); /*建立存放和的链表表头*/s->data=-1;t=s; carry=0; /*carry:进位*/while(pp->data!=-1&&qq->data!=-1) /*均不是表头*/{total=pp->data+qq->data+carry; /*对应位与前次的进位求和*/number=total%HUNTHOU; /*求出存入链中部分的数值*/carry=total/HUNTHOU; /*算出进位*/t=insert_after(t,number); /*将部分和存入s向的链中*/pp=pp->next; /*分别取后面的加数*/qq=qq->next;}r=(pp->data!=-1)?pp:qq; /*取尚未自理完毕的链指针*/while(r->data!=-1) /*处理加数中较大的数*/{total=r->data+carry; /*与进位相加*/number=total%HUNTHOU; /*求出存入链中部分的数值*/carry=total/HUNTHOU; /*算出进位*/t=insert_after(t,number); /*将部分和存入s指向的链中*/r=r->next; /*取后面的值*/}if(carry) t=insert_after(t,1); /*处理最后一次进位*/t->next=s; /*完成和的链表*/return s; /*返回指向和的结构指针*/}NODE *inputint(void) /*输入超长正整数*/{NODE *s,*ps,*qs;struct number {int num;struct number *np;}*p,*q;int i,j,k;long sum;char c;p=NULL; /*指向输入的整数,链道为整数的最低的个位,链尾为整数的最高位*/ while((c=getchar())!='\n') /*输入整数,按字符接收数字*/if(c>='0'&&c<='9') /*若为数字则存入*/{q=(struct number *)malloc(sizeof(struct number)); /*申请空间*/q->num=c-'0'; /*存入一位整数*/q->np=p; /*建立指针*/p=q;}s=(NODE *)malloc(sizeof(NODE));s->data=-1; /*建立表求超长正整数的链头*/ps=s;while(p!=NULL) /*将接收的临时数据链中的数据转换为所要求的标准形式*/ {sum=0;i=0;k=1;while(i<4&&p!=NULL) /*取出低四位*/{sum=sum+k*(p->num);i++; p=p->np; k=k*10;}qs=(NODE *)malloc(sizeof(NODE)); /*申请空间*/qs->data=sum; /*赋值,建立链表*/ps->next=qs;ps=qs;}ps->next=s;return s;}void printint(NODE *s){if(s->next->data!=-1) /*若不是表头,则输出*/{printint(s->next); /*递归输出*/if(s->next->next->data==-1)printf("%d",s->next->data);else{int i,k=HUNTHOU;for(i=1;i<=4;i++,k/=10)putchar('0'+s->next->data%(k)/(k/10));}}}NODE *pp,*qq,*r,*s,*t;int total,number,carry;pp=p->next; qq=q->next;s=(NODE *)malloc(sizeof(NODE)); /*建立存放和的链表表头*/s->data=-1;t=s; carry=0; /*carry:进位*/while(pp->data!=-1&&qq->data!=-1) /*均不是表头*/{total=pp->data+qq->data+carry; /*对应位与前次的进位求和*/number=total%HUNTHOU; /*求出存入链中部分的数值*/carry=total/HUNTHOU; /*算出进位*/t=insert_after(t,number); /*将部分和存入s向的链中*/pp=pp->next; /*分别取后面的加数*/qq=qq->next;}r=(pp->data!=-1)?pp:qq; /*取尚未自理完毕的链指针*/while(r->data!=-1) /*处理加数中较大的数*/{total=r->data+carry; /*与进位相加*/number=total%HUNTHOU; /*求出存入链中部分的数值*/carry=total/HUNTHOU; /*算出进位*/t=insert_after(t,number); /*将部分和存入s指向的链中*/r=r->next; /*取后面的值*/}if(carry) t=insert_after(t,1); /*处理最后一次进位*/t->next=s; /*完成和的链表*/return s; /*返回指向和的结构指针*/}NODE *inputint(void) /*输入超长正整数*/{NODE *s,*ps,*qs;struct number {int num;struct number *np;}*p,*q;int i,j,k;long sum;char c;p=NULL; /*指向输入的整数,链道为整数的最低的个位,链尾为整数的最高位*/ while((c=getchar())!='\n') /*输入整数,按字符接收数字*/if(c>='0'&&c<='9') /*若为数字则存入*/{q=(struct number *)malloc(sizeof(struct number)); /*申请空间*/q->num=c-'0'; /*存入一位整数*/q->np=p; /*建立指针*/p=q;}s=(NODE *)malloc(sizeof(NODE));s->data=-1; /*建立表求超长正整数的链头*/ps=s;while(p!=NULL) /*将接收的临时数据链中的数据转换为所要求的标准形式*/ {sum=0;i=0;k=1;while(i<4&&p!=NULL) /*取出低四位*/{sum=sum+k*(p->num);i++; p=p->np; k=k*10;}qs=(NODE *)malloc(sizeof(NODE)); /*申请空间*/qs->data=sum; /*赋值,建立链表*/ps->next=qs;ps=qs;}ps->next=s;return s;}void printint(NODE *s){if(s->next->data!=-1) /*若不是表头,则输出*/{printint(s->next); /*递归输出*/if(s->next->next->data==-1)printf("%d",s->next->data);else{int i,k=HUNTHOU;for(i=1;i<=4;i++,k/=10)putchar('0'+s->next->data%(k)/(k/10));}}}。
(完整)五年级下整数加减法
(完整)五年级下整数加减法五年级下整数加减法
整数加减法是数学中的基本运算之一,本文档将介绍五年级下学期中整数加减法的相关知识和技巧。
1. 整数的概念
整数是由正整数、负整数和零组成的数集。
正整数是大于零的整数,负整数是小于零的整数,零是正整数和负整数的分界点。
2. 整数的加法
整数的加法规则如下:
- 正数加正数,结果为正数;
- 负数加负数,结果为负数;
- 正数加负数,结果的符号由数值较大的数决定。
3. 整数的减法
整数的减法规则如下:
- 正数减正数,结果的符号由数值大小决定;
- 负数减负数,结果的符号由数值大小决定;
- 正数减负数,先把减数取反,然后按加法规则求和。
4. 加减法练题
请完成以下加减法练题:
1. 5 + (-3) =
2. (-7) + 2 =
3. (-9) + (-6) =
4. 9 - 4 =
5. 6 - 9 =
6. (-3) - (-8) =
5. 解答
以下是练题的解答:
1. 5 + (-3) = 2
2. (-7) + 2 = -5
3. (-9) + (-6) = -15
4. 9 - 4 = 5
5. 6 - 9 = -3
6. (-3) - (-8) = 5
6. 总结
整数加减法是五年级下学期的重要内容,掌握好整数的加法和减法规则对于解决数学题目非常有帮助。
通过反复练和巩固,我们可以提高整数的计算能力。
希望本文档对你理解五年级下整数加减法有所帮助!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桂林电子科技大学综合设计说明书用纸《数据结构与算法》课程设计说明书题目:长整数的加减运算学院:计算机科学与工程学院专业:信息安全姓名:xxxxxxxx学号:11003601xx指导教师:张瑞霞老师2013年9 月13 日成绩评定标准及成绩1、能按照格式进行写作,无抄袭现象(10分)2、报告内容行文通畅,有条理性,无错别字,结构严谨。
(10分)3、能够按照数据结构课设的格式要求、排版要求和字数要求等,有需求分析,系统分析,详细设计,关键技术的介绍和参考文献。
(10分)4、在验收过程中,能合理的回答问题(20分)5、软件能正常运行,实现所提出的功能(40分)6、软件代码规范性较好(5分)7、具有自己的创新或特色(5分)总成绩:目录1、前言 (3)2、需求分析 (4)2.1.问题描述: (4)2.2.基本要求: (4)2.3.更高要求: (4)2.4.测试数据: (4)2.5.开发环境 Visual C++6.0(完整绿色版) (5)3、系统概述 (5)3.1.关键技术。
(5)3.2.相关的函数接口 (6)3.3.功能设计 (7)4、系统分析 (7)5、系统的调试与结果 (17)5.1.调试过程出现的问题以及解决方法 (17)5.2.成功的测试数据截图 (17)6、课设小结 (20)7、参考文献: (21)1、前言本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
由于在某些工程上进行加减运算时,有时候需要对很大的长整数进行计算,但是计算机本身提供的数据类型无法保证存在几百位甚至几千位的数字,所以需要设计专门的算法系统对数据进行相应的计算。
因此本系统的设计主要任务是:设计一个程序能够实现任意长整数的加减运算的程序,而且能够对一些错误异常进行辨别调整,从而迅速计算出正确无误的结果。
程序输入格式是字符串,包含元素的范围是数字,都好,负号以及分号,保存时需要用到双链表将字符串每四位保存在循环链表中的一个结点中,然后在计算出运行结果。
虽然程序有些复杂,但使用方法十分简单,只需按照相关提示进行操作即可,能够为用户的学习和工作带来快捷与方便。
2、需求分析本系统主要内容是为数据结构长整数加法的实现,所以整个程序是为了实现长整数的加减法运算。
设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加运算和减运算。
长整数的长度没有限制,可以是任意长,正确处理好运算之后的进位和借位。
2.1.问题描述:首先最初的目的是设计一个实现任意长的整数进行加法运算的演示程序。
2.2.基本要求:利用双向循环链表实现长整数的存储,每个结点含一个整型变量。
任何整型变量的范围是-(215-1)~(215-1)。
输入输出形式:按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开。
2.3.更高要求:(1)仅仅是能运行长整数的加法,还是不能达到我们运算的需求,因此,对于长整数的减法运算的设计将是对我们系统更高的一次挑战。
(2)多个长整数的连续加减法,并带括号等。
具体方式可以参见表达式的求值部分,利用栈。
2.4.测试数据:(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”。
(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”。
(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
注:实现提示:(1)每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数的4位,即不超过9999的非负整数。
整个链表是为万进制数。
(2)可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
2.5.开发环境 Visual C++6.0(完整绿色版)Visual C++ 6.0 (完整绿色版)使用说明:1、软件安装后,在桌面和开始菜单里分别建立快捷方式。
2、此版本适用于计算机等级考试上机环境及一般的C++应用。
3、此版本为默认安装后对安装文件夹完整打包,并安装windows\system32下的相应文件。
4、系统默认安装在:C:\Program Files\Microsoft Visual Studio 。
5、VC6.0通用补丁:特别适合于解决错误信息:“Compiling... , Error spawning cl.exe”使用方法:退出VC,运行此文件,单击"是",再启动VC,可解决大部分问题。
6、系统安装后,如果考试系统提示没有安装VC,不影响使用,自行从桌面的快捷方式启动vc,然后打开需要调试的程序,调试即可,不影响考试系统评分。
3、系统概述3.1.关键技术。
3.1.1存储结构:循环双向链表。
循环链表是将单链表的形式稍作改变,不让最后一个结点的指针指为NULL,而让它指向头一个结点;双链表给运算带来的最大好处是可以很容易地找到结点的前驱和后继。
将双链表的头一个结点和最后一个结点连接起来,这样不增加额外存储却给某些运算带来方便。
图3.1.1.加入头结点的循环双链表3.1.2.主要算法的基本思想:每个结点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。
但若这样存,即相当于按32768进制数存,在十进制数与32768进制数之间的转换十分不方便。
故可以在每个结点中仅存十进制数4位,即不超过9999的非负整数,整个链表视为万进制数。
可以利用头结点数据域的符号代表长整数的符号。
用其绝对值表示元素结点数目。
相加过程中不要破坏两个操作数链表。
两操作数的头指针存于指针数组中是简化程序结构的一种方法。
不能给长整数位数规定上限。
3.1.3.数据结构设计:因为计算的事一个连续的数字,需要按顺序一次计算,所以采用的数据结构的逻辑结构是线性表。
根据用户需求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
3.2.相关的函数接口3.2.1.结构体:struct dl_node{int x;dl_node *pre;dl_node *next;};3.2.2.初始化:void list_init(dl_node ** h)3.2.3.插入元素:void list_insert(dl_node *h,int x)3.2.4.输出链表:void prin(dl_node *h)3.2.5.实现相加:void list_add(dl_node *h1,dl_node *h2)3.2.6.实现相减:void list_sub(dl_node *h1,dl_node *h2)3.3.功能设计3.3.1.输入两个数,用链表来存储。
链表的头结点的数据的值为1时,表示的是输入的数非负;为-1时表示输入的数是负数。
3.3.2.在创建链表时,让高位在链表的尾部,低位在链表的头部。
3.3.3.在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。
3.3.4.如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。
3.3.5.异号的两个数想加时,先去两个数的绝对值,用较大的数减去较小的数,差作为和的绝对值。
如果相应的位够减时,直接做减法,否则借位,但是要注意被借位的值是否为零,如果为零,则继续借位。
3.3.6.输出最终结果,输出数时,要去掉大数最前面的零,直到数的首位不是零时为止。
在输出地位的数时,有可能某些单元的数低于四位,必须要在四位数的高位补零,即四位一个单元输出。
空缺处用零补齐。
4、系统分析对于本系统而言:如果是两个长整数相加,每个加数都需要一个循环链表存储,则必须定义两个循环链表h1、h2,即:循环双链表;while(p!=h)循环双向链表一直往右找,直到找到头结点为止{printf(",%04d",p->x);%04d为对齐方式,当一个结点值不足4位则补齐p=p->next;}puts("");}元素值相加,已处理好h1比h2的长度大于等于h1的长度最后结果保存在h1(即长串中)void list_add(dl_node *h1,dl_node *h2){dl_node *p=h1->pre,*q=h2->pre;int e=0;while(q!=h2)每次相加,如果有进位则保存到e变量中{int tmp=p->x+q->x+e;if(tmp>9999){p->x=tmp%10000;e=tmp/10000;}elsep->x=tmp;p=p->pre;q=q->pre;}当h1长度大于h2的时候,还要对未相加的部分进行操作while(p!=h1){int tmp=p->x+e;if(tmp>9999){p->x=tmp%10000;e=tmp/10000;}elsep->x=tmp;p=p->pre;}p=h1->next;如果最高位得到的结果还有进位,那么就要再创建一个结点if(e!=0){dl_node *s;s=(dl_node *)malloc(sizeof(dl_node));s->x=e;s->pre=p->pre;p->pre->next=s;s->next=p;p->pre=s;}}元素值相减方法同相加类似最后结果保存在h1(即长串中)void list_sub(dl_node *h1,dl_node *h2){dl_node *p=h1->pre,*q=h2->pre;此处flag的值即位借位的值,借位的值为0或者为1,因为减0无关紧要int flag=0;while(q!=h2){if(p->x-flag>=q->x){p->x-=q->x+flag;flag=0;}else{p->x=p->x+10000-q->x-flag;flag=1;}p=p->pre;q=q->pre;}同样的,如果h1的长度大于h2的长度,那么对剩下的操作while(p!=h1){if(p->x-flag<0){p->x=p->x+10000-flag;flag=1;}else{p->x=p->x-flag;flag=0;}p=p->pre;}如果最高位为0的话,那么就要删除最高位的结点了p=h1->next;while(p->x==0){p->pre->next=p->next;p->next->pre=p->pre;p=h1->next;}}打印输入提示int main(){cout<<"----------------------------------------------------"<<endl;cout<<"桂林电子科技大学计算机科学与工程学院信息安全"<<endl;cout<<""<<endl;cout<<""<<endl;cout<<" 11003601班罗宗聪"<<endl;cout<<""<<endl;cout<<"----------------------------------------------------"<<endl;cout<<" 欢迎使用-长整数的加减运算-系统"<<endl<<endl;cout<<"请输入两个任意长整数,并以; 隔开,然后‘Enter’"<<endl;cout<<"如:1314,5210 + 5210,1314"<<endl;cout<<" 1314,5210;"<<endl;cout<<" 5210,1314;"<<endl;cout<<" 6524,6524"<<endl;cout<<"----------------------------------------------------"<<endl;// freopen("大数求和.txt","r",stdin);while(1){puts("");char c;int a;dl_node *h1,*h2;list_init(&h1);输入元素,直到读入" ; "则停止输入第一个链表值while(1){//cout<<"asdfa";scanf("%d%c",&a,&c);//cout<<c<<endl;list_insert(h1,a);if(c==';') break;}如果第一个元素小于0,则取负值,并在头结点当中保存信息if(h1->next->x<0){h1->x=-h1->x;h1->next->x=-h1->next->x;}//prin(h1);list_init(&h2);int r=0;相同方法输入第二个链表,碰到" ; "则停止,并且读到文件结束{if(scanf("%d%c",&a,&c)==EOF){r=1;break;}list_insert(h2,a);if(c==';')break;}//cout<<r<<endl;如果第一个元素小于0,则取正值,并在头结点当中保存信息if(h2->next->x<0){h2->x=-h2->x;h2->next->x=-h2->next->x;}/h1_num和h2_num分别表示长度int h1_num=h1->x,h2_num=h2->x;把长的放到h1里面,是为了后面的加减操作更顺利if(abs(h1_num)<abs(h2_num)){dl_node *tmp=h1;h1=h2;h2=tmp;h1_num=h1->x,h2_num=h2->x;}//cout<<h1_num<<" "<<h2_num<<endl;此处为重点部分,分为两个部分,如果h1大于h2四种情况如果h1等于h2也有四种情况如果他们的长度不相等,即h1大于h2了if(abs(h1_num)!=abs(h2_num)){如果都为正数if(h1_num>0&&h2_num>0){//prin(h1);list_add(h1,h2);prin(h1);continue;}如果都为负数elseif(h1_num<0&&h2_num<0){list_add(h1,h2);cout<<"-";prin(h1);continue;}如果h1为正而h2为负else if(h1_num>0&&h2_num<0){list_sub(h1,h2);prin(h1);continue;}如果h1为负而h2为正elseif(h1_num<0&&h2_num>0){cout<<"-";list_sub(h1,h2);prin(h1);}}否则,如果他们长度都相等的话:else{如果都为正数if(h1_num>0&&h2_num>0){list_add(h1,h2);prin(h1);continue;}如果都为负数else if(h1_num<0&&h2_num<0){list_add(h1,h2);cout<<"-";prin(h1);continue;}如果h1为正而h2为负elseif(h1_num>0&&h2_num<0){这种情况,如果h1最高结点元素大于h2的最高元素,那么交换链表if(h1->next->x<h2->next->x){dl_node *tmp=h1;h1=h2;h2=tmp;//h1_num=h1->x,h2_num=h2->x;//prin(h1);//prin(h2);这种情况得先输出一个负号cout<<"-";}交换之后加法还是一样list_sub(h1,h2);continue;}如果h1为负而h2为正elseif(h1_num<0&&h2_num>0){if(h1->next->x<h2->next->x){dl_node *tmp=h1;h1=h2;h2=tmp;//cout<<"-";}否则为负值,要输出负号else cout<<"-";list_sub(h1,h2);prin(h1);}}5、系统的调试与结果5.1.调试过程出现的问题以及解决方法由于对编程的熟练度不是很高,所以在编程的过程中往往很容易出现错误。