ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:283.95KB ,
资源ID:8741639      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8741639.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(长整数代数计算数据结构课程设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

长整数代数计算数据结构课程设计.docx

1、长整数代数计算数据结构课程设计沈阳航空航天大学课 程 设 计 报 告课程设计名称:数据结构课程设计课程设计题目: 长整数的代数计算院(系):计算机学院专 业:计算机科学与技术 班 级: 学 号: 姓 名: 指导教师: 1 题目介绍和功能要求1.1 题目介绍 设计数据结构完成长整数的表示和存储,并编写算法来实现两个长整数的加、减、乘、除等基本代数运算。1.2 功能要求1) 长整数长度在一百位以上。2) 实现两长整数在同余代数下的加、减、乘、除操作。即实现算法来求解a+b mod n,a-b mod n,a*b mod n,ab mod n。3)输入输出均在文件中。(选作)1.3 基本功能1.ji

2、afa(); 将一百位以上的长整数进行加法运算,计算出和。2.jianfa(); 将一百位以上的长整数进行减法运算,计算出差。3.chenfa();将一百位以上的长整数进行乘法运算,计算出积。4.chufa(); 将一百位以上的长整数进行除法运算,计算出商和余数。2 系统功能模块结构图2.1 系统功能结构框图图2.1 系统功能结构框图2.2 系统主要模块的功能说明1.主模块kongzhi();控制输入模块、加法模块、减法模块、乘法模块、除法模块、输出模块的循环使用。2.输入模块shuru();将输入的两组长整数分别通过转换将其转换成所需要的形式存储到两个链表(opr1、opr2)中保存起来。3

3、.加法模块 jiafa();将链表opr1、opr2中的数据进行加法运算,并且二者的将加和保存到链表oprr中。4.减法模块 jianfa();将链表opr1、opr2中的数据进行减法运算,并且将二者的差保存到链表oprr中。5.乘法模块 chengfa();将链表opr1、opr2中的数据进行乘法运算,并且将二者的乘积保存到链表oprr中。6.除法模块 chufa();将链表opr1、opr2中的数据进行加法运算,并且将二者的商和余数分别保存到链表quti、remand中。7.输出模块 shuchu(); 将链表oprr、quti、remand中的数据保存到字符数组中,并且将字符数组中的数据

4、输出到屏幕上。 3 使用的数据结构的描述3.1 数据结构设计将输入的两个长整数首先保持到字符数组中,然后将字符数组中的字符转换每四个一组,利用双向循环链表来实现每一组字符的存储,并且高位在前、低位在后。每个结点中只存储四位十进制数字,即不超过9999的非负整数。利用两个双向循环链表分别保持了两个非负长整数。加法:由低位的结点开始相加,加和大于9999时,加和除以一万取余数保存到新的双向循环链表结点中,并且加和除以一万取整数作为进位加到下两个结点相加中,依次循环相加;减法:同加法有些相似,保证第一个长整数不小于于第二个长整数,结点相减,不能相减就相前一结点借位,差保存到新的双向循环链表结点中,依

5、次循环;乘法:由低位的结点开始相乘,乘积大于9999时,乘积除以一万取余数保存到新的双向循环链表结点中,并且乘积除以一万取整数作为进位加到下两个结点乘积中,依次循环相乘;除法:开辟两个新的链表,保存商数和差。用第一个长整数循环减去第二个长整数,没减一次计数加一,计数保存到商数链表中。直到差小于第二个长整数停止循环,最后的计数为商值,差值为余数。选择该数据结构来完成长整数的加减乘除运算是因为要对长整数进行运算,需要对长整数进行存储,所以选择用链表对长整数存储,又由于存储的顺序是从左到右,而运算的顺序则是从右到左,这样位了操作方便选择循环链表,在运算过程中有进位和借位的操作,所以最终选择双向循环链

6、表的数据结构。3.2 数据结构用法说明输入的两个长整数必须为非负长整数。加法计算时只要保证两个数都为非负数即可,减法、乘法、除法时需要保证第一个长整数大于第二个长整数。同时乘法、除法计算时第二个数不能为零,并且输入的数一定要合法,最高位不能为零,否则程序会提示输入有误。 4 函数的描述4.1主要函数设计1.shuru ();作用:将输入的两个长整数分别保存到两个链表中。2.jiafa();作用:将两个长整数进行加法运算,计算出二者的和。3.jianfa();作用:将两个长整数进行减法运算,计算出二者的差。4.chengfa ();作用:将两个长整数进行乘法运算,计算出二者的积。5.chufa(

7、); 作用: 将两个长整数进行除法运算,计算出二者的商和余数。6.shuchu();作用: 将保存到链表中的计算结果输出。4.2 主要函数流程图1. kongzhi(): 图4.2.1控制函数流程图 2. jiafa(); 图4.2.2加法函数流程图 3. jianfa(); 图4.2.3减法函数流程图4、chengfa();图4.2.4乘法函数流程图 5、chufa(); 图4.2.5除法函数流程图 5程序测试和运行的结果5.1 程序测试1、程序开始菜单: 图5.1.1 菜单图 2、程序退出:图5.1.2退出程序图5.2 运行结果1、加法运算:图5.2.1除法运算图2、减法运算:图5.2.2

8、除法运算图3、乘法运算:图5.2.3除法运算图4、除法运算:图5.2.4除法运算图 6参考文献1谭浩强著. C程序设计( 第三版). 北京: 清华大学出版社,20052严蔚敏 吴伟明.数据结构(C语言版).北京:清华大学出版社,20073 王裕明.数据结构与程序设计.北京:清华大学出版社,20104 谭浩强.C语言程序设计M.北京:清华大学出版社,20055 王敬华 林萍 张清国.C语言程序设计教程M.北京:清华大学出版社,2005附 录(关键部分程序清单)#include stdafx.h#include#include#include#include#define LEN sizeof(s

9、truct Node)#define MAX 1000#define OK 1#define ERROR 0#define OVERFLOW -1#define TRUE 1#define FALSE 0typedef int Status;typedef struct Node int data; struct Node *prior,*next;Node,*NodeList;int axp(int a,int k) /求指数函数值 int r=1; if(k=0) return 1; for(;k0;k-) r=r*a; return r;Status zhuanhuan(char str

10、,NodeList &oprh) /输入转换函数/将字符串形式的操作数转换成所需的类型 NodeList p; int i,k,buffer; k=buffer=0; oprh=(NodeList)malloc(LEN); oprh-next=oprh; oprh-prior=oprh; for(i=strlen(str)-1;i=0;i-) if(i!=0 | (str0!=- & str0!=+)&(stri9 | strinext-prior=p; p-prior=oprh; p-next=oprh-next; oprh-next=p; p-data=buffer; buffer=k=0

11、; return OK;Status shuru(NodeList &opr1,NodeList &opr2,char str)/输入函数 int flag=OK; printf(nn请输入第一个操作数:n); scanf(%s,str); getchar(); flag=zhuanhuan(str,opr1); while(!flag) printf(整数输入有误,请重新输入:n); scanf(%s,str); getchar(); flag=zhuanhuan(str,opr1); printf(nn请输入第二个操作数:n); scanf(%s,str); getchar(); flag

12、=zhuanhuan(str,opr2); while(!flag) printf(整数输入有误,请重新输入:n); scanf(%s,str); getchar(); flag=zhuanhuan(str,opr2); return OK;/输出函数Status shuchu(NodeList oprr,char str) Status initbuf(char str); NodeList p; int i,j,num4; if(!oprr) return ERROR; p=oprr; i=j=0; initbuf(str); p=p-next; if(p-next=oprr & p-da

13、ta=0)/若要输出的数为0则执行 stri+=0; else while(p!=oprr) num0=p-data/1000; num1=(p-data-num0*1000)/100; num2=(p-data-num0*1000-num1*100)/10; num3=p-data-num0*1000-num1*100-num2*10; while(jnext; j=0; stri=0; printf(%s,str); printf(n); return OK;Status initbuf(char str)/缓冲区部分初始化函数 int i; for(i=0;iprior; p2=opr2

14、-prior; while(p1-prior!=opr1 & p2-prior!=opr2) p1=p1-prior; p2=p2-prior; if(p1-prior!=opr1) return 1; if(p2-prior!=opr2) return -1; return 0;int length(NodeList oprr) /求链表长度 int count=0; NodeList p=oprr-next; while(p!=oprr) count+; p=p-next; return count;Status Creat(NodeList &oprr,int len) /生成指定长度链

15、表 NodeList p; oprr=(NodeList)malloc(LEN); p=oprr; while(len0) p-next=(NodeList)malloc(LEN); p-next-data=?; p-next-prior=p; p=p-next; len-; p-next=oprr; oprr-prior=p; return OK;int compare(NodeList opr1,NodeList opr2) /比较opr1、opr2绝对值的大小 NodeList p1,p2; p1=opr1-next; p2=opr2-next; if(cmplinklen(opr1,o

16、pr2)=1)/opr1比较长 return 1; else if(cmplinklen(opr1,opr2)=-1)/opr2比较长 return -1; else/长度相等的情况 while(p1-data=p2-data & p1-next!=opr1) p1=p1-next; p2=p2-next; if(p1-datap2-data) return 1; else if(p1-datadata) return -1; else return 0; /-初始化链表函数-Status init(NodeList &oppr) oppr=NULL; return OK;/=加法模块=Sta

17、tus jiafa(NodeList opr1,NodeList opr2,NodeList &oprr)/本算法实现A,B相加的操作 int CF,buffer; NodeList p1,p2,p3; oprr=(NodeList)malloc(LEN); oprr-next=oprr; oprr-prior=oprr; p1=opr1-prior; p2=opr2-prior; CF=buffer=0; while(p1!=opr1 & p2!=opr2) buffer=p1-data+p2-data+CF; CF=buffer/10000;/若buffer的值大于9999则产生进位,赋给

18、CF /将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next=oprr-next; oprr-next=p3; p3-data=buffer%10000;/应该将buffer的第四位赋给p3-data /. p1=p1-prior; p2=p2-prior; while(p1!=opr1) /处理opr1链的剩余部分 buffer=p1-data+CF; CF=buffer/10000;/若buffer的值大于9999则产生进位,赋给CF /将新建结点插入到头结点之后 p3=(Nod

19、eList)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next=oprr-next; oprr-next=p3; p3-data=buffer%10000; /. p1=p1-prior; while(p2!=opr2) /处理opr2链的剩余部分 buffer=p2-data+CF; CF=buffer/10000;/若buffer的值大于9999则产生进位,赋给CF /将新建结点插入到头结点之后 p3=(NodeList)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next

20、=oprr-next; oprr-next=p3; p3-data=buffer%10000; p2=p2-prior; if(CF) p3=(NodeList)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next=oprr-next; oprr-next=p3; p3-data=CF; return OK;/=减法基本操作=Status jianfa(NodeList opr1,NodeList opr2,NodeList &oprr)/本算法实现A,B相减的操作 /将A链分成与B链长相等的底位部分,和剩余的高位部分,并做相应处理。

21、int CF,buffer,flag; NodeList p1,p2,p3,qh,qt,qq; oprr=(NodeList)malloc(LEN); oprr-next=oprr; oprr-prior=oprr; p1=opr1-prior; p2=opr2-prior; CF=buffer=flag=0; while(p2!=opr2)/opr2链的长度小于等于opr1链的 if(p1-datadata+CF) buffer=10000+p1-data-(p2-data+CF); CF=1; else buffer=p1-data-(p2-data+CF); CF=0; p3=(Node

22、List)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next=oprr-next; oprr-next=p3; p3-data=buffer; p1=p1-prior; p2=p2-prior; while(p1!=opr1) /处理opr1链剩下的部分 if(p1-datadata-CF; CF=1; else buffer=p1-data-CF; CF=0; p3=(NodeList)malloc(LEN); oprr-next-prior=p3; p3-prior=oprr; p3-next=oprr-next; oprr-ne

23、xt=p3; p3-data=buffer; p1=p1-prior; /处理链表开头结点值为0的无意义情况,若链表本身表示0,则不做如下处理 p3=oprr-next; while(p3-data=0 & p3-next!=oprr) p3=p3-next; flag=1; if(flag) qh=oprr-next;/保存无用结点的头尾指针 qt=p3-prior;/为释放做准备 oprr-next=p3;/重接next链 p3-prior=oprr;/重接prior链 qt-next=NULL; while(qh!=NULL) /释放无用结点 qq=qh; qh=qh-next; fre

24、e(qq); return OK;/=乘法模块=Status chengfa(NodeList opr1,NodeList opr2,NodeList &oprr) NodeList ph1,ph2,pt1,pt2,p3,pt3,qq; int len,CF; long buffer; ph1=opr1; pt1=ph1-prior; ph2=opr2; pt2=ph2-prior; len=length(opr1)+length(opr2); Creat(oprr,len); qq=oprr-next; while(qq!=oprr) qq-data=0; qq=qq-next; buffer=CF=0; p3=oprr-prior; while(pt2!=ph2) pt1=ph1-prior; pt3=p3; while(pt1!=ph1) buffer=pt1-data*pt2-data+pt3-data+CF; CF=(int)buffer/10000; pt3-data=(int)buffer%10000; pt1=pt1-prior; pt3=pt3-prior; pt3-data=CF;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1