大整数计算实验报告

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

石家庄经济学院

实验报告

学院: 信息工程学院

专业: 计算机科学技术

计算机人论坛

1.需求分析

1.1开发背景

在现实生活中不可避免地我们会遇到一些超大整数之间的运算,比如要计算马云的资产,以及国有银行的转账收入支出等一些数的存储等等类似的问题,而由于计算机整形数的最小值和最大值范围仅为-32768到32767,所以关于大整数的实验即呼之欲出,本实验就是针对数值很大、精度很高的大整数进行的加法减法以及乘法的计算。

1.2数据需求

指针:L1,L2:分别为指向这两条存储要进行运算的链表头结点的指针;L3:指向乘法的结果链表;L4:在运算乘法的时候做中间量使用。prior:双向链表的头指针;next:双向链表的尾指针。

data:整形数,链表所存的数据。

1.3功能需求

对一个进行运算的软件,加法和减法是最基本的运算,本实验又额外增加了大整数的乘法。

1.4测试数据

第一个数:9,568,974,512;

第二个数:8,648,761,512;

2.概要设计

2.1功能模块图

由需求分析可画出如下功能模块图。

图2-1 功能模块图

2.2各功能子程序定义

1.创建链表:

Status creat(DuLinkList &L,char str[30]);

2.输出链表中结点内的数据:

Status output(DuLinkList L);

3.加法:

DulNode *Add(DuLinkList L1,DuLinkList L2);

4.减法:

DulNode *Sub(DuLinkList L1,DuLinkList L2);

5.乘法:

DulNode *Mul(DuLinkList L1,DuLinkList L2);

计算机人论坛

2.3主界面截图

图2-3 程序主界面

3.详细设计

3.1数据结构设计

此款软件是基于线性表双向链表完成的,在每个分过程中都充分利用了链表指针灵活又不太易于掌控的特性,但若是全面理解指针以及链表的特点,也是很容易设计此款软件的。

在大整数加减乘法软件中主要有以下几种数据

(1)Status, ElemType都是宏定义的整形量;

(2)DulNode是结构体,包含三个域,data,prior,next,分别是整形数,

左指针,右指针;

3.2模块详细设计

由于加法和减法的操作易于实现,在此并不一一赘述。

乘法的实现:

(1)构思:本函数又另设一个指针L3和L4,L3用于存储每一层的乘法结果,

L4则每次都加上L3链表,直至结束,最后L4指向的链表即为乘法的结

果。

(2)一级算法:

P1和p2分别指向L1和L2结点的下一个结点

遍历L1和L2,分别计算两链表的长度

若L2长于L1,则分别交换L1和L2,p1和p2。

新建结点L3和L4,p3和q分别指向L3指向的结点。

Do

{

计算L3链表

}

为L3加上头结点;把L3赋给L4;

P1重新置于L1尾部,p2前移一位;

Do

{

重新做一条L3链;

Do

{

计算L3链

}当p1->next为NULL

W指向L3链尾;

把L3加到L4上;

}当p2->prior为空

返回L4;

(3)二级求精:

L3->data = 上一位的进位加上L1结点加上L2结点;

计算Prov;

新建L3->prior;

计算L3结点数据;

P1前移

计算机人论坛

3.3测试与运行

本程序是用C语言在VisualC++环境编译所完成,经部分数据验证无误,现将测试与运行结果展示如下:

(1)加法:

图3-3-1 加法(2)减法和乘法:

图3-3-2 减法和乘法(3)输入:

图3-3-3 输入

计算机人论坛

4.总结与展望

《数据结构》果然不是闹着玩的,要想学好,必须得下苦功夫!!!

5.参考文献

[1].严蔚敏.数据结构[M].北京:清华大学出版社,2013。

计算机人论坛

6.源代码清单

#include

#include

#include"max_tou.h"

Status input(LinkList &p)

{

LinkList head,s;

int v;

int tamp;

tamp=0;

head=(LinkList)malloc(sizeof(LNode));

p=head;

while(tamp==0) /*创建n个元素的双向链表*/

{

scanf("%d",&v); /*束三个三个输入*/

if (v>=0)

{

s=(LinkList)malloc(sizeof(LNode));

s->data=v; /*赋值*/

p->next=s; /*连接*/

s->prior=p;

p=s;

}

else

tamp=1; /*为负数时结束*/ }

head=head->next; /*去掉头节点*/

head->prior=NULL; /*让双向链表前后都为空*/

p->next=NULL;

return OK;

}

Status output(LinkList &p,LinkList &head) /*输出*/

{

LinkList s;

s=head;

while(s!=NULL)

{

if(s->data>=100) printf("%d",&s->data);

if(s->data>=10 && s->data<100) printf("0%d",&s->data);

if(s->data>0 && s->data<10) printf("00%d",&s->data);

s=s->next;

}

return OK;

}

Status max_add(LinkList &head1,LinkList &head2,LinkList &p1,LinkList

相关文档
最新文档