数据结构长整数四则运算(DOC)

合集下载

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

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

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

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

任何整形变量的范围是 -(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)//将各个位的正负、大小、进位进行调整源程序:。

数据结构实验四:四则运算表达式

数据结构实验四:四则运算表达式

HUNAN UNIVERSITY 课程实验报告题目:四则运算学生姓名学生学号专业班级指导老师李晓鸿完成日期 2 0 1 5年12 月10日一、需求分析1.程序的功能本程序要求首先输入一组数据进行四则运算,输入的数据是按照中缀表达式的结构输入的,完成初始化后,把中缀表达式用后缀表达式(逆波兰表达式)输出,同时输出计算结果。

2.输入的形式输入一个平时所用的正常的四则运算表达式(不需要特别注意输入式子是否正确),输入的数字的范围是(0至2^16)的小数或者整数,输入的符号限于(+-*/^)3.输出的形式程序的输出就是转化后的后缀表达式以及计算的结果,输出结果间用空格隔开;4.测试数据①正常的输入输入21+23*(12-6)输出后续表达式为21 23 12 6 - * +计算结果为159②输入有两个符号的错误情况输入6*3++4*(14-8)输出非括号运算符不能直接接非括号运算符ERROR③输入有小数的情况输入2.0*(11.2-5.3)+2.5后续表达式为2.0 11.2 5.3 - * 2.5 +计算结果为14.3④有整数小数的情况输入2/(3.0+5)*3输出后续表达式为2 3.0 5 + / 3 * 计算结果为0.75⑤错误的输入输入2a+3输出a为非法字符error二、概要设计1.抽象数据类型本题目中,首先需要按顺序读取数字和操作符,将它们分别保存到两个数据结构中,如果最先保存的操作符优先级不大于接下来保存的操作符,将一直不被调用直到上一级操作符被调用,满足先进后出的数据结构,所以用栈来保存操作符。

对于保存的数字,每次调用操作符时,同时将最后保存的两位数字调用,满足先进后出的数据结构,所以用栈来保存数字。

由于需要用后缀表达式输出,按照进栈出栈的顺序,我们将符号作为节点,数字作为左右子树,依次相连成为一颗二叉树,通过后续遍历将二叉树输出。

2.算法的基本思想①.本题目在之后的操作中需要将数字和操作符进入不同的栈,所以我们在程序设计之前需要先设计函数判断读取的字符是数字还是操作符。

长整数四则运算 实验报告

长整数四则运算 实验报告

“数据结构”课程设计报告长整数四则运算学生姓名:吴成杰徐文良指导教师:陈少军所在系:电子信息系所学专业:计算机科学与技术年级:2010计算机(1)班目录第1章需求分析 (1)1.1选题要求 (1)1.2选题背景和意义 (1)1.3选题目标 (2)1.4组员分配任务 (2)第2章概要分析 (2)2.1系统数据流图 (2)2.2原始数据 (3)2.3输出数据 (3)2.4对数据的处理 (3)2.5数据结构(存储方式) (4)2.6模块分析 (4)第3章详细设计 (4)第4章系统说明书 (11)第5章系统测试 (12)项目总结 (16)参考文献 (17)第1章需求分析1.1选题要求1、实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算2、2个人对应完成2个人各自的任务1.2选题背景和意义(1)选题背景操作系统老师曾经布置我们做一道斐波拉契数列和求30的阶乘,但是计算的结果很大,还不知道该做样的存储,老师告诉我们需要用高精度数的知识能将计算的结果存储起来,数据结构老师也曾经布置过一个实验题,是计算长整数的加法的,但是长整数的位数是固定的。

于是我们试想计算任意长度的整数是不是能把所有的四则运算问题解决。

(2)选题意义我们选的这个课题能计算任意的四则运算,比如:1234567+7654321=8888888987654321-123456789=86419754123*456=5608884/42=2586-25*15+8*(9*2-144/12)=586-375+8*(18-12)=586-375+8*6=586-355+48=211+48=2591.3选题目标实现一个任意长度的整数进行四则运算的演示程序(1) 运算过程分步骤显示(2) 完成含有加法和减法的四则运算(3) 完成含有乘法和除法的四则运算(4) 包含括号的四则运算1.4组员分配任务我们组有两个成员,分别为吴成杰和徐文良,一个负责写主函数、函数整体的框架和写转换函数函数和对输入的字符进行处理,一个负责写出栈函数和写处理函数和拼接,程序出现错误,两个人一起在一起互相商量,修改。

实验报告长整数四则运算

实验报告长整数四则运算

实验报告:长整数四则运算实验者:唐怡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个数据元素。

计算机C++实现任意长整数的四则运算

计算机C++实现任意长整数的四则运算

计算机C++实现任意长整数的四则运算一、什么是任意长整数任意长整数,也称作大整数或无限长整数,可以表示出任意长度的整数,是由多个整数构成的有限序列。

它的最大特征是其位数不受限制,可以用来表示任意大小的整数。

二、任意长整数四则运算1、四则运算任意长整数四则运算是指对任意长整数进行加、减、乘、除四种基本运算的操作。

2、C++实现任意长整数的四则运算(1)首先要明确,任意长整数是由多个整数构成的有限序列,所以要想实现四则运算,必须将单个整数进行相应的计算。

(2)因此,可以采用逐位计算的方法来实现任意长整数的四则运算。

具体的步骤如下:(a)以字符串的形式表示任意长整数,并转换成整型数组,每个元素代表任意长整数中的一位数字;(b)从数组的末尾开始,依次取出每一位数字,根据相应的运算符进行计算;(c)将计算结果存入到一个新的数组中;(d)最后,把新数组中的元素按照从小到大的顺序组合成一个新的字符串,这就是任意长整数的四则运算的结果。

三、C++实现任意长整数的四则运算的算法(1)定义函数原型:string Cal(stringstr1,string str2,char op);(2)申请内存空间:int *arr1 = newint[str1.length()]; int *arr2 = newint[str2.length()]; int *res = newint[max(str1.length(),str2.length())];(3)将字符串转化为整型数组:for(int i=0;i <str1.length();i++) arr1[i] = str1[i] - '0'; for(int j=0;j < str2.length();j++) arr2[j] = str2[j] - '0';(4)根据所传入的运算符,进行相应的运算:switch (op) {case '+': //加法运算break; case '-': //减法运算break; case '*': //乘法运算break; case '/': //除法运算break;}(5)将计算结果存入到新的数组中:for(intk=0;k<max(str1.length(),str2.length());k++) res[k] = add[k];(6)将计算结果的数组转换成字符串:string result=""; for(intl=0;l<max(str1.length(),str2.length());l++) result += to_string(res[l]);(7)返回计算结果return result;(8)释放内存空间delete[] arr1; delete[] arr2; delete[] res;四、总结任意长整数四则运算是指对任意长整数进行加、减、乘、除四种基本运算的操作。

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

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

一、需求分析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。

长整数四则运算+阶乘+乘方=数据结构课程设计(保证原创性)

长整数四则运算+阶乘+乘方=数据结构课程设计(保证原创性)

数据结构课程设计报告题目:长整数四则运算学院计算机学院专业计算机科学与技术年级班别2010级四班学号3110006015学生姓名张法光指导教师张巍成绩____________________2012年6月一、需求分析1、设计一个实现任意长的整数进行四则运算的程序。

2、利用双向循环链表实现长整数的存储,每个结点含一个整型变量。

3、输入和输出形式是按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。

4、实现长整数四则运算、阶乘和乘方运算。

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”.二、概要设计为了实现上述功能,采取双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。

利用头结点数据域的符号表示长整数的符号,相加过程不破坏两个操作数链表,对长整数位数不作上限。

为此需要两个结构数据类型:双向循环链表和长整数,两个类型采用相同的结构,只是双向循环链表用来存储数据,长整型用表示数据的运算。

1、双向循环链表的数据结构及操作定义如下:typedef int Status;typedef int ElemType;typedef struct DuLNode //双向循环链表结点{ElemType data;struct DuLNode * prior;struct DuLNode * next;}DuLNode,* DuLinkList;typedef struct //双向循环链表{DuLinkList head; //双向循环链表头结点,不存放数据int len; //双向循环链表中的结点个数,头结点不计}LinkList;基本操作:Status InitList(LinkList &L);//构造一个空的线性链表void ClearList(LinkList &L);//将线性链表L重置为空表,并释放原链表的结点空间Status HeadInser(LinkList &L,ElemType e);//在线性链表的头结点后插入数据元素为e的新结点Status TailInser(LinkList &L,ElemType e);//在线性链表的头结点前插入数据元素为e的新结点Status HeadDelete(LinkList &L);//删除头结点后的第一个结点Status ListCopy(LinkList &L,LinkList L1);//将L1复制给L,保持L1不变2、长整数的数据类型和和操作定义为:void ScanNum(LinkList &L);//从键盘输入一个长整数,存至L;void PrintNum(LinkList L);//在屏幕打印长整数Lvoid NumChange(LinkList &L);//将长整数L还原成一般格式Status NumLarger(LinkList L1,LinkList L2);//比较正数L1与正数L2的大小,若L1大于或等于L2,返回TRUE,否则返回FALSE void NumPlus(LinkList L1,LinkList L2,LinkList &L3);//将L1与L2相加,结果存至L3; 即C=A+B;void NumMinus(LinkList L1,LinkList L2,LinkList &L3);//计算L1减去L2的值,结果存至L3;即C=A-B;void NumMul(LinkList L1,LinkList L2,LinkList &L3);//将L1与L2相乘,结果存至L3;即C=A*B;Status NumDiv(LinkList L1,LinkList L2,LinkList &L3,LinkList &L4);即C=A/B;//计算L1除以L2,商存至L3,余数存至L4,若L2为零,返回ERROR,否则返回OKStatus jiecheng(LinkList L1,LinkList &L2)即C=A!;//求L1的阶乘L2;若L1小于零,返还ERROR;否则返回OK;Status chengfang(LinkList L1,LinkList L2,LinkList &L3) 即C=A^B;//求L1的L2次方的结果,若L2小于零,返还ERROR;否则返回OK;3、本程序包含四个模块:1)主程序模块:void main( ) //main.c{初始化;do{接受命令;处理命令;}while(“命令”=“结束”)}2)双向循环链表处理模块//LinkList.h;3)长整数运算模块//LongNum.h ,jiecheng.h , chengfang.h;4)界面模块 //Interface.h各模块之间的调用关系如下:主程序模块==========================================长整数运算模块界面模块======================双向循环链表处理模块=======================三、详细设计1、主要函数主程序模块//main.c双向循环链表处理模块//LinkList.h长整数四则运算模块//LongNum.h阶乘运算模块//jiecheng.h乘方运算模块//chengfang.h界面模块//Interface.hchar ShowMenu() //界面菜单显示char ShowPlus() //加法运算显示char ShowMinus() //减法运算显示char ShowMul() //乘法运算显示char ShowDiv() //除法运算显示char Showchengfang()//乘方运算显示char Showjiecheng() //阶乘运算显示2、函数的主要调用关系图InitList ClearList Interface=============================ShowScanNumJiecheng chengfang NumMinus NumChange======================================================================四、调试分析及编程心得体会刚开始使用C指针有偏颇,通过逐步调试修正错误。

(完整word版)c++实现任意长整数的四则运算

(完整word版)c++实现任意长整数的四则运算

实验题目:设计一数据结构可处理任意长度的整数概要设计1.数据结构的定义采用双向链表存储任意长整数。

双向链表的定义如下:class DblList {private:DblNode *head, *tail;DblNode *current;int sign;public:DblList();用说明:点击打开应用程序。

依次输入任意两个整数(例如123456,+1234567),按回车,会出现菜单,如下图:按‘1’则实现两整数的加法按‘2’则实现两整数的乘法按‘#’结束注:菜单可重复出现直至‘#’退出。

实现加法,乘法如下图:2.测试结果:(1) 123456(2) +1234567(3) -1(4) 12a3(5)+注:当输入错误时,允许重新输入。

五、源程序/* 主函数 *//***************************************************/#include ""void main(){string s;string p;DblList list1;while(1){ xit |"<<endl;cout<<"--------------------------"<<endl;while (1){cin>>choose;if (choose=="1"){list1+list2;break;}else if (choose=="2"){list1*list2;break;}else if (choose=="#"){return;}else{cout<<"输入有误,请重新输入!!"<<endl;continue;}}}}/*头文件,包括长整数数据结构的定义,成员函数的定义*//***********************************************************/#include <iostream>#include <string>#include <cmath>using namespace std;struct DblNode{int data;DblNode * prior;DblNode * next;};bool IsNum(char a){ //判断字符a是否是便是数字int s=a-'0';if(s>=0&&s<10) return true;else return false;}bool IsInt(string a){ //判断字符串a是否表达一串数字bool Jud=1;int i=1;char s=a[0];if (a=="+"||a=="-") return false;if (s=='+'||s=='-') {}else if (s>='1'&&s<='9'){}else if (a[0]=='0'&&a[1]=='\0') return true;else return false;while (a[i]!='\0'){Jud=IsNum(a[i]);if (Jud==0) return false;i++;}return true;}int JudSign(string s){ //返回数字的符号if (s[0]=='-') return -1;else if(s[0]=='0'&&s[1]=='\0') return 0;else return 1;}int CtoI(char a){int i=a-'0';return i;}class DblList { //定义一个双向链表类,存储任意长度的数字private: //并可以进行标准化输出和加法,乘法。

数据结构综合实训长整数四则运算

数据结构综合实训长整数四则运算

4
长整数四则运算实现
长整数四则运算实现
加法
对于加法,我们需要从低位到高位依次相加。如果结果大于等于10,我们需要进位。我们 可以使用链表或数组来实现这个算法
链表加法示例代码(Python)
THANK YOU
2
数据结构选择
数据结构选择
链表
链表是一种动态数据结构,可以根据需要随时增加或减少节点。链表中的每个节点包含两 部分:数据和指向下一个节点的指针。使用链表可以方便地实现长整数的每一位的存储和 操作
数据结构选择
数组
数组是一种静态数据 结构,其大小在创建 时确定,不能更改。 对于长整数,我们可 以使用数组来表示每 一位数字,从而实现 大数的存储和运算
20XX
数据结构综合实训 -长整数四则运算
时 间:20XX-XX-XX
-
1 2 3 4
1
引言
引言
在计算机科学中,长整数四则运算是一 个经典问题
由于计算机的整数类型通常有固定的范 围,在进行大数运算时,必须采用特殊 的数据结构和技术来处理
本实训将介绍如何使用链表和数组来实 现长整数的表示和四则运算
数据结构选择
3
长整数表示
长整数表示
链表表示法
我们可以将长整数表示为一个链表,其中 每个节点存储一个数字(0-9)。例如,数 字123可以表示为1->2->3。链表的头部表 示整数的低位,尾部表示高位
长整数表示
数组表示串中的每个字符存储在数 组的一个元素中。例如,数字123可以表示为array [ 0]=1, array [ 1]=2, array [ 2]=3

长整数四则运算

长整数四则运算

山东理工大学计算机学院课程设计(数据结构)班级计科0503班姓名王新政学号0512105988指导教师肖爱梅张艳华二○○七年七月十三日课程设计任务书及成绩评定课题名称长整数四则运算Ⅰ、题目的目的和要求:设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。

通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

Ⅱ、设计进度及完成情况Ⅲ、主要参考文献及资料[1]严蔚敏,吴伟民主编. 《数据结构》(C语言版).清华大学出版社. 2002[2] 殷人昆等著. 《数据结构》(C++版). 清华大学出版社. 2001[3] 金远平著. 《数据结构》(C++描述). 清华大学出版社. 2005[4] Frank M.Carrano 等著. 《数据结构与C++高级教程》.清华大学出版社. 2004[5] 严蔚敏,吴伟民主编. 《数据结构习题集》(C语言版).清华大学出版社. 2002学科部主任___________(签字)Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○○七年七月十三日目录第一章概述 (1)第二章系统分析 (2)第三章概要设计 (3)第四章详细设计与源程序 (4)第五章调试过程中的问题及系统测试情况 (12)第六章结束语 (13)参考文献 (14)第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。

课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。

《数据结构》是一门重要的专业基础课,是计算机理论和应用的核心基础课程。

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

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

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

(完整word版)长整数四则运算实验报告

(完整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”结果如下图:六、心得体会本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。

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

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

一、需求分析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。

长整数四则运算实验报告

长整数四则运算实验报告

数据结构课内实验报告书一、实验题目:长整数四则运算二、实验目的:通过本次实验,熟练掌握链表的存储结构及其各种基本运算,体会链表操作的特点。

三、实验要求:设计一个实现任意长的整数进行加法运算的演示程序。

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

任何整形变量的范围是-(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”。

(6)-9999,9999,9999;-9999,9999,9999;应输出“1,9999,9999,9998”。

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

五、设计与实现过程(1)存储结构的定义typedef struct int72 {int i[4];} INT72;INT72 a,b,c;typedef struct LinkNode{int data; //记录每个节点的整数(小于10000)LinkNode *next, *pre; //记录下一个节点的地址 *pre; //记录前一个节点的地址}linklist;(2)主要算法的描述void addtwo()//节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的//默认head0存的整数绝对值比head1大{int s=0,m1=head0->data,m2=head1->data;m1=(head0->pre->data/abs(head0->pre->data)); //head0的符号m2=(head1->pre->data/abs(head1->pre->data)); //head1的符号linklist *p=head0->pre->pre,*q=head1->pre->pre;result->data=head0->pre->data; //存结果的节点数和符号while(q!=head1->pre)//head0存的整数绝对值比head1大,即head0的节点数大于或等于head1 {currptr=(linklist *)malloc(sizeof(linklist));currptr->data=(p->data)*m1+(q->data)*m2+s; //两整数相加if((m1*m2)>0) //如果符号相同{if(abs(currptr->data)-10000>=0) //相加后超过10000,则进位{s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else //abs(currptr->data)-10000<0,不进位{s=0;currptr->data=abs(currptr->data);}}else if(m1>0&&m2<0)//符号不同,在此相当于实现两个正整数相减{s=0;if(currptr->data<0) //小于0,向前一位借1{currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0)//符号不同,在此相当于实现负整数加上正整数{s=0;if(currptr->data>0) //大于0,{currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->next=result; //存入链表currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;q=q->pre;}//当head0节点数比head1长时,继续建链while(p!=head0->pre){currptr=(linklist *)malloc(sizeof(linklist)); currptr->data=p->data+s;s=currptr->data/10000;if((m1*m2)>0){if(abs(currptr->data)-10000>=0){s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else {s=0;currptr->data=abs(currptr->data);} }else if(m1>0&&m2<0){s=0;if(currptr->data<0){currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0){s=0;if(currptr->data>0){currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->data=abs(currptr->data)%10000; currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;}if(s!=0) //处理相加后,进位问题{currptr=(linklist *)malloc(sizeof(linklist));currptr->data=abs(s);currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;result->pre->data=m1*(abs(result->pre->data)+1);}}六、技巧与体会在编写程序中尽量做到独立完成、对于自己想要完成的问题要主动编程完成、这样自己是一个很大的提升、也能学到很多的知识、熟练编程!以后要加强动手时间能力、多与同学交流算法精髓!。

课程设计 长整数四则运算

课程设计 长整数四则运算

课程设计实验报告:1.4 长整数四则运算题目:长整数四则运算一、实验内容【问题描述】设计一个实现任意长的整数进行加法运算的演示程序【基本要求】利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

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

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

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

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

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

数据结构四则运算

数据结构四则运算

具体思路:根据书上的栈的四则运算的应用里的提示,是用逆波兰(后缀表达式)算法进行运算。

我们正常的四则运算式的是中缀表达式,如:3+2*4-6/3*(4-2),但是这种语言机器无法识别,必须转换成后缀表达式,如:324*+63/42-*-,然后再用栈去进行操作运算。

首先,一个四则运算式包含操作符和运算符,所以要建立两个栈去分别存储他们,存储的时候,数字可以直存储,但是运算符因为要部分先出栈进行运算,所以此时就要考虑什么时候出栈,什么时候直接进栈,此时优先级矩阵就应运而生:在运算到+,-,*,/运算符时,则用栈顶元素与当前运算符进行优先级比较:●若对应的数组元素为-1,则当前运算符(运算符编码)进栈,调整pp 指向下一个字符。

●若对应的数组元素为1,则取运算符栈顶运算符和操作数栈顶操作数进行运算,参与运算的运算符和操作数出栈,运算结果进操作数栈。

实现为:OPND[topNd-2]=OPND[topNd-2] op OPBD[topNd-1];topNd--;topTr--;如果此时topTr-1还是比此时进栈的运算符优先级大的话,则执行循环上述过程。

●若当前字符是左括号(: 则直接进栈,pp 指向下一个字符●若当前字符是右括号):进行一下情况的讨论:若栈顶是左括号,则左括号出栈,pp 指向下一个字符若栈顶是运算符,则取运算符栈顶运算符和操作数栈顶操作数进行运算,参与运算的运算符和操作数出栈,运算结果进操作数栈。

实现为:OPND[topNd-2]=OPND[topNd-2] op OPBD[topNd-1];topNd--;topTr--;Op为topTr-1的运算符。

重复该操作,直到栈顶出现左括号“(”。

若栈顶是#,则左括号和右括号不配对,结束处理,返回出错标志(0)●若当前字符为#:依次从运算符栈取出运算符和从操作数栈取出操作数进行计算,直到运算符栈的栈顶为#为止。

此时就是把运算符栈里的运算符全部输出和操作数进行运算。

任意长整数的四则运算

任意长整数的四则运算

1题目介绍和功能要求课程设计题目要求问题描述:设计一个实现任意长的整数进行加法运算的演示程序 ;题目内容:利用双向循环链表实现长整数的存储,每个结点含一个整形变量;任何整形变量的范围是 -215- 1~215- 1;输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开;基本要求:1利用所学知识,设计相应的数据结构;2熟练运用开发环境;3完成软件的设计与编码;4熟练地掌握基本的调试方法;题目分析需求分析:1本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算;2本演示程序中,数字字符限定为‘0’~‘9’和字符‘,’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符;3利用双向循环链表现实长整数的存储,每个结点含一个整形变量;输入的形式以回车结束,可以直接输入正数或负数;按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理,但不使用分隔符也不影响结果;2系统功能模块结构图系统功能结构框图图系统功能结构图主要模块的功能说明:1主调程序模块:void main{初始化;do{图用户界面3 输入命令,执行相应的功能:1---加法运算2---减法运算3---乘法运算4---除法运算5---退出系统图执行界面4 加法运算测试图加法运算界面5 减法运算测试图减法运算界面6 乘法运算测试图乘法运算界7 除法运算测试图除法运算界面7 参考文献1 严蔚敏,吴伟民.数据结构C语言版M.北京:清华大学出版社,20062 吕国英.算法设计与分析M.北京:清华大学出版社,20063 徐宝文,李志.C程序设计语言M.北京:机械工业出版社,20044 滕国文.数据结构课程设计M.北京:清华大学出版社,20105 苏仕华.数据结构课程设计第2版M.北京:机械工业出版社,20106 李建学,李光.数据结构课程设计案例精编M.北京:清华大学出版社,20107 汪沁,奚李峰.数据结构与算法M.北京:清华大学出版社,20128 奚小玲,敖广武.数据结构理论与实践M.北京:东北大学出版社,2010附录:程序清单带有必要的注释include<cstdio>include<cstring>include<>include<>include<>include<>define LEN sizeofstruct Node define MAX 1000define OK 1 define ERROR 0 define OVERFLOW -1 define TRUE 1 define FALSE 0 typedef int Status;typedef struct Node{int data;struct Node prior,next; }Node,NodeList;。

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

实习1 1.4长整数四则运算实习报告题目:设计一个实现任意长的整数进行加法运算的演示程序。

一、需求分析1.本演示程序中,利用双向循环链表实现长整数的存储,每个结点含一个整型变量任何整型变量的范围是-(215-1)—(215-1)。

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

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

2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入数据中的非法字符)和运算结果显示在其后。

3.程序执行的命令包括:(1)构造链表;(2)输入数据;(3)数据处理;(4)结束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。

二、概要设计struct LinkNode //定义结构体LinkNode{int data; //记录每个节点的整数(小于10000)LinkNode *next; //记录下一个节点的地址LinkNode *pre; //记录前一个节点的地址};class LinkList //定义类LinkListprivate:LinkNode *head0,*head1; //head0,head1分别记录两个整数链表的头指针LinkNode *currptr;LinkNode *result; //result记录结果链表的头指针public:LinkList(); //构造函数,初始化链表~LinkList(); //析构函数,释放空间void Creat(string a); //引入字符串,创立两个链表,分别表示两个整数void Add(); //实现两个整数相加void Display(); //显示结果void addtwo(); //节点多的作为被加数,少的作为加数,实现整 //数绝对值大的加小的};void main() //主函数{……do{} while(Yes_No=='y'||Yes_No=='Y'); //Yes_No不等于'Y'或'y'时,程序退出}三、详细设计#include<iostream>#include<string>#include<math.h>using namespace std;struct LinkNode{int data; //记录每个节点的整数(小于10000)LinkNode *next; //记录下一个节点的地址LinkNode *pre; //记录前一个节点的地址class LinkList{private:LinkNode *head0,*head1; //head0,head1分别记录两个整数链表的头指针LinkNode *currptr;LinkNode *result; //result记录结果链表的头指针public:LinkList(); //构造函数,初始化链表~LinkList(); //析构函数,释放空间void Creat(string a); //引入字符串,创立两个链表,分别表示两个整数void Add(); //实现两个整数相加void Display(); //显示结果void addtwo(); //节点多的作为被加数,少的作为加数,实现整 //数绝对值大的加小的};//链表的实现部分int sum(int n);LinkList::LinkList() //构造函数,初始化链表{head0=new LinkNode;//申请一个空间记录整数的符号和节点数head1=new LinkNode;head0->next=head0;head0->pre=head0; //初始化链表,建立双向循环链表head1->next=head1;head1->pre=head1;result=new LinkNode;result->next=result;result->pre=result;currptr=NULL;}LinkList::~LinkList() //析构函数,释放空间{LinkNode *p1=head0,*p2=head1,*p3=result;//三个指针分别指向三条链表的头指针while(p1!=p1->pre){p1->pre->next=p1->next;p1->next->pre=p1->pre;currptr=p1;p1=p1->next;delete currptr;}while(p2!=p2->pre) //逐个删除节点,释放空间{p2->pre->next=p2->next;p2->next->pre=p2->pre;currptr=p2;p2=p2->next;delete currptr;}while(p3!=p3->pre){p3->pre->next=p3->next;p3->next->pre=p3->pre;currptr=p3;p3=p3->next;delete currptr;}// delete p1;// delete p2;// delete p3;}void LinkList::Creat(string a) //引入字符串,创立两//个链表,分别表示两个整数{int i=0,j=0,m=0,n=0,k=0,l=0,s=0,w=0;//i记录字符串,j记录加数节点数;s记录被加数节点数//w标记字符串中的‘-’号//k记录字符串中的字符转化为整数的值,l使每个节点记录4位while(a[m]!=';') m++; //m记录字符串中被加数的字符数n=m;while(a[n]!='\0') n++; //n记录字符串的总字符数if(a[0]=='-'){head0->data=(-1); //记录整数符号w=1;}else{head0->data=1;}for(i=m-1;i>=w;i--){if(a[i]!=',') //把字符转化为整数{k+=(a[i]-'0')*sum(l);l++;}if(a[i]==','||i==w){currptr=new LinkNode; //把整数存到双向循环链表中currptr->data=k;currptr->next=head0;currptr->pre=head0->pre;head0->pre->next=currptr;head0->pre=currptr;head0=currptr;s++; //节点数加1k=0; //重新初始化k和ll=0;}}head0->pre->data*=s; //存储整数符号和节点数//与建第一个整数链表一样,建立第二个整数链表head1k=0;l=0;if(a[m+1]=='-'){head1->data=(-1);m++;}elsehead1->data=1;for(i=n-1;i>m;i--)if(a[i]!=','){k+=(a[i]-'0')*sum(l);l++;}if(a[i]==','||i==m+1){currptr=new LinkNode;currptr->data=k;currptr->next=head1;currptr->pre=head1->pre;head1->pre->next=currptr;head1->pre=currptr;head1=currptr;j++;k=0;l=0;}}head1->pre->data*=j;}void LinkList::Add() //实现两个整数相加{LinkNode *temp;if(abs(head0->pre->data)>abs(head1->pre->data))//两个整数中,绝对值大的为被加数addtwo();else if(abs(head0->pre->data)<abs(head1->pre->data))temp=head0;head0=head1;head1=temp;addtwo();}else if(abs(head0->pre->data)==abs(head1->pre->data)){int k1,k2;LinkNode *p=head0,*q=head1;//如果节点数相同,则判断节点中数值大小while(p->data==q->data&&p!=head0->pre->pre&&q!=head1->pre->pre) {p=p->next;q=q->next;}k1=p->data;k2=q->data;if(k1>k2)addtwo();else{temp=head0;head0=head1;head1=temp;addtwo();}}}void LinkList::addtwo()//节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的//默认head0存的整数绝对值比head1大{int s=0,m1=head0->data,m2=head1->data;m1=(head0->pre->data/abs(head0->pre->data)); //head0的符号m2=(head1->pre->data/abs(head1->pre->data)); //head1的符号LinkNode *p=head0->pre->pre,*q=head1->pre->pre;result->data=head0->pre->data; //存结果的节点数和符号while(q!=head1->pre)//head0存的整数绝对值比head1大,即head0的节点数大于或等于head1 {currptr=new LinkNode;currptr->data=(p->data)*m1+(q->data)*m2+s; //两整数相加if((m1*m2)>0) //如果符号相同{if(abs(currptr->data)-10000>=0) //相加后超过10000,则进位 {s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else //abs(currptr->data)-10000<0,不进位{s=0;currptr->data=abs(currptr->data);}}else if(m1>0&&m2<0)//符号不同,在此相当于实现两个正整数相减{s=0;if(currptr->data<0) //小于0,向前一位借1 {currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0)//符号不同,在此相当于实现负整数加上正整数{s=0;if(currptr->data>0) //大于0,{currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->next=result; //存入链表currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;q=q->pre;}//当head0节点数比head1长时,继续建链while(p!=head0->pre){currptr=new LinkNode;currptr->data=p->data*m1+s;s=currptr->data/10000;if((m1*m2)>0){if(abs(currptr->data)-10000>=0){s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else {s=0;currptr->data=abs(currptr->data);} }else if(m1>0&&m2<0){s=0;if(currptr->data<0){currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0){s=0;if(currptr->data>0){currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->data=abs(currptr->data)%10000;currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;}if(s!=0) //处理相加后,进位问题{currptr=new LinkNode;currptr->data=abs(s);currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;result->pre->data=m1*(abs(result->pre->data)+1);}}void LinkList::Display() //显示结果{LinkNode *p=result;int FuHao=result->pre->data/abs(result->pre->data);//结果的符号while(p->data==0&&p!=result->pre->pre)//当运算后前几个节点的数据为0时,不输出{p=p->next;result->pre->data=(abs(result->pre->data)-1)*FuHao;//结果记录非0节点数}cout<<FuHao*p->data; //首先显示符号和第一个节点中的数if(abs(result->pre->data)!=1) p=p->next; //判断非0节点数是否为1 while(p!=result->pre->pre) //继续输出{cout<<","; //每4位一组,并用‘,’隔开cout.width(4);cout.fill('0');cout<<p->data;p=p->next;}if(p==result->pre->pre&&abs(result->pre->data)!=1)//显示最后一个节点数据{cout<<",";cout.width(4);cout.fill('0');cout<<p->data;}cout<<endl;}int sum(int n) //计算10的乘方{int i,s=1;for(i=1;i<=n;i++){s=s*10;}return s;}//主函数和其他函数的实现void main() //主函数{cout<<"***********************************************\n";cout<<"**********欢迎使用任意长整数加法系统***********\n";cout<<"***********************************************\n";";cout<<"\n";cout<<"在此系统中,可以输入任意长的整数。

相关文档
最新文档