1、 目目 录录 一、 题目概述(内容及要求) . 2 二、功能分析 2 三、设计. 3 四、运行与测试 4 五、总结. 21 六、参考文献 21 一、 题目概述(内容及要求) 内容: 请设计一个有效的算法,可以进行两个 n 位大整数的四则运算。 长整数长度在二十位以上。 实现两长整数的加、减、乘、除操作。 要求: 1.设计数据结构,存储结构; 2.在 c 兼容环境完成上述题目的代码编写与调试; 3.程序运行界面交互性好; 4.软件运行,给出测试数据。 二、功能分析 1. 设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正 负数的区别。 2. 输入每四位一组,组间用逗号隔开,长整数
2、位数没有上限,以分号结束长整 型数据的输入。用 lnode 结点数据结构存储数据。每一个数据有一个头结点, 它的 data 域用来放数据的正负数。其余结点的数都为正整数。 3. 程序包含数据的输入,判断,运算,输出和主函数。 4. 具体程序执行的命令包括: a) 输入函数:inputa();inputb();/的输入并建立双向循环链表 b) 判断函数:compare();/比较数据的大小 c) 运算函数:unsigndeadd();/无符号的加法 a) unsigndesub();/无符号的减法 b) add();sub();mul();div();/加减乘除四则运算 d) 输出函数:divp
3、ut();/除法结果的输出函数 a) putoutc();/其余结果的输出函数 e) 主函数:main(); 5. 系统功能结构框图 主模块 输入模块 减 法 模 块 加 法 模 块 乘 法 模 块 除 法 模 块 输出模块 图图 2.2.1 1 系统功能结构框图系统功能结构框图 三、设计 首先要考虑的是如何表示长整型数。可以 4 位数形成 1 组,而一个长整型数 可能会有很多组这种 4 位数,而每节之间是有先后顺序的,因此我们可以考虑用 数组和链表来存储数据。(1)再考虑到每个长整型数的长度在输入之间是无法预 知的,因此使用链表在存储空间的分配上更方便一些。(2)在输入数据时总是从 高位到低
4、位地存储, 而计算时总是从低位向高位运算, 因此采用双向链表更方便, 而为了从头结点方便地转到尾结点可以采用循环链表。综上考虑,应以双向循环 链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过 9999 的整数, 整个链表用十进制数表示。(3)对于每一个长整型数可以设置一个头结点头结点,其中 的数据域用来表示该长整型数的正负号及组数, 该值的符号则表示该长整型数的 符号,该数的绝对值表示该长整型数包含的 4 位数的组数。第一个存储 4 位数据 组的结点称为首结点首结点,而最后一个 4 位数据组结点称为尾结点尾结点。 为此需要结构数据类型:双向循环链表: typedef struct ln
5、ode/结点结构体 int data; struct lnode *next; struct lnode *prior; lnode,*lnodelist 主要的模块可分为: 输入函数:inputa();inputb();/的输入并建立双向循环链表 判断函数:compare();/比较两个数据的大小,进行相应的的计算。 运算函数:add();sub();mul();div();/运算 输出函数:divput();putoutc();/除法的输出及其他运算的输出。 主函数:main(); 四、运行与测试 图图 4.1 长整数加法运行结果图长整数加法运行结果图 实现以上加法操作的程序如下: int
6、 add(lnodelist e=ahead-data*bhead-data; coutdata; coutdata; coutnext; 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=p