任意长整数的四则运算(C++)(http://blog.163.com/zhongguojiliangfgg@126/blog/static/48510017200992875315870/)

任意长整数加法运算(C++)
一、【实验内容】
【问题描述】
  设计一个实现任意长的整数进行加法运算的演示程序
【基本要求】:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。任何整形变量的范围是 -(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、熟悉掌握双向循环链表的基本操作;
2、熟悉任意长字符串的输入,并实现把字符串转化为整数;
3、熟悉任意长整数的加法运算;
4、更进一步掌握有关类的操作

 

三、实验文档:
                  长整数加法运算
一、需求分析
1、本程序实现计算任意长的整数的加法运算. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’]和字符‘,’与‘;’,输入字符可以任意长,输入形式以“回车符”为结束标志,串中字符顺序不限,且允许出现重复字符。
3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。输入的形式以回车结束,可以直接输入正数或负数。按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。但不使用分隔符也不影响结果。
4、测试数据
(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,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 OrderedList{
数据对象:D={ai|ai∈int,i=1,2,...n, n≥0}
数据关系:R1={|ai-1,ai∈D|=2,……n }
基本操作:
Creat(string a)
操作结果:通过字符串a构造两个位数不限的长整数。
addtwo(head0,head1,result)
初始条件:head0,head1都已存在,且head0的绝对值比head1大
操作结果:result等于head0和head1的和。
Add(head0,head1)
初始条件:head0,head1都已存在。
操作结果:判断head0与head1绝对值的大小,
并使head0的绝对值比head1大
Display(result)
初始条件:result已存在。
操作结果:按四位一组,分隔符为","的格式,在屏幕上输出result。
}ADT OrderedList

 


2.本程序包含三个模块:
1)主程序模块:
void main(){
    初始化;
do{
   接受命令;
   处理命令;
}while(“命令”=”退出”)
}
2)、集合单元模块——实现集合的抽象数据类型
3)、结点结构单元模块——定义集合的结点结构
各模块之间的调用关系如下:
                    主程序模块
                    
                    
                     集合单元模块                 

                    
                     结点模块
二、详细设计
1、ZhengshuAdd.h文件,链表的定义部分
#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:
 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值